#include "utils.hpp"
#define MINIAUDIO_IMPLEMENTATION
std::string simplified_characters =
    "制咖片型超声盘鉴定仔点他命书歌粉巾字帐恤手指记忆棒形转弯沟光○〇㐄㐅㐆㐌㐖毒㐜㐡㐤㐰㐺㑇㑳㒳㒸㔾㗂㗎㝵㞎㞙㞞以㢲㢴"
    "㤅㥁㥯㨗㫺㬎㮎㮚㮸㲋㲱㲾㳮涧㵪㶸㷖㷭㹢㹴犬㺢狓㺵碗㽮㿝䍃䔢䖟䖸䗈䗥䗪䝓射䥯䦉䯝鲃鱼䲔䳗鹅䵹鼄䶑一对应映射丁不识下儿"
    "子做二休世丘之貉并中台原则串为甚谓干净了百事无成八变五十些人得道鸡升天代如并来去个国政策劲幽灵在欧洲游荡接样萝卜坑"
    "侧化传价元论醇共再准刀两断切分耕耘收获钱货物向看旧就绪险刻千金动劳永逸匙零夜半卡通回复返影踪反常态口咬气句话同吐快"
    "吹周味呼诺呜品红锅哄而散起唱和问三知生熟团漆黑火糟堆场空块面塌糊涂尘染壁厢夔已足多情露水大早到晚夫妻当关万莫开失古"
    "恨套所料既往孔见提师要家主审寸阴难买斗牛小撮部阵局展身层巴掌帆风顺席地带过年计于春头载四季期被蛇怕井绳度愿式份弹顷"
    "深前律径心意念差愁孤行俱全房厅交遮打技长把抓死拿眼泪鼻涕钥锁折段抿拍即合扫排掬挥拨拥上入击洞掷揽改故辙败文值名斑方"
    "面旁族日秋餐隔雅里终父旦时晌会霎间晃暴寒曝更月望垠际朝夕本正经利杯羹东西板枝独秀根筋杆进条龙服务概模次函数又性程总"
    "付步脚印趋登毛拔呵氧氮碳决雌雄波未平派谎言流清楚白准溜烟潭有获闻是处降琴鹤甲病发可拾沙目然了直以相眨穿睹瞥瞬矢的解"
    "石鸟神教秉虔诚秘种窝蜂穷窍笑置笔苟勾销抹杀煞等奖箍节吃箭仇双雕诗筹箩筐系列纸级士官统丝毫挂维网尽线微吭响股脑胎脉承"
    "腔臂力致效资源址器举功投般说讲规贸易叶障着慎满皆输号木电池衣倾钟高低视仁觉醒览遗角银币触溃九鼎蔽抄出驷马追重语破贫"
    "洗贯走路安蹴至几蹶振跃役胆汗较辈轮辞赞退六连遍递边针血锤音错门思闪真倒项栽雾类保护川先惊乍体哄鳞爪鸣滴泡邻域党专鼓"
    "作齐炒丑烯亥克内酯冬加奴卯肝炎基尺梁街裤镐客宠庭巳汝昌烷玲磊糖肇酉醛啷青县韪良香骨鲷丂七集河市弦喜嘴张舌堵区工业姊"
    "妹星架构巧彩扭歪拼凑余热曜武州爷浮屠美乡老阶树荤素碎落能魄鳃鳗珠丄丅丆万俟丈尚摸母娘量管群亚虎必我堂令申件装伏位博"
    "侠义界表女墟台戏臭皮匠胜诸葛亮赛顶倍催请运算包立叉戟离疫苗土史志演围揭瓦晒夷姑婆帝村宝烂尖杉碱屉桌山岔岛由纪峡坝库"
    "镇废从德后拗汤治旬食明昧曹朋友框栏极权幂曲归依猫民氟硼氯磷铁江侗自旅法司洋浦梅园温暖湾焦班幸用田略番叠皇炮捶硝苯酸"
    "腺苷棱草镜穗跳远索锦纲聚氰胺联店胚膲爱色堇紫罗兰芝茶饭菱云虫藏藩乱叛苏亲债凳学座恐恋柱测肌腹衩锥系貂企乌跪叩军车农"
    "题迭都甘油屯奏键短阿姨陪姐只顾茅庐槽驾魂鲜鹿页其菜单乘任供势午齿汉组织吊调泻唇坡城报坟外夸将尉建筑岸岗公床扬新剑升"
    "杭林栗校楼标款汽社浣海商馆剧院钢华港机械广媒环球融第医科证券综财乐育游涨犹岭疏瘾睑确兵领导缴肢膛船艾瑟尔苍蔡虞效衫"
    "覆访诉课谕议轨述野钩限敌鞋颌颔颚饶首龈站例修凡划垂届属崽颏厨拜挫摆放旋削棋榻槛礼沉注滑营狱画确仪聘花葬诏员跌辖周达"
    "酒锚闸陷陆雨雪飞威丌于丹久乏予理评产亢卑亦乎舞己悲矩圆词害志但住佞佳便俗信票案幅翁倦伦假偏倚斜亏鬼敲停备伤脾胃仅此"
    "像俭匮免宜穴焉戴兼容许冻伯仲负彼昼皂轩轾实刊划颠卫战哥比省非好黄饰别拘束掩奶睬选择摇扰烦苦枚写协厌及格受欢迎约只估"
    "侵犯割状告或缺抗拒挽撤救药喻磨灭端倪少逆逾越避靠适吉誉吝玉含延咎歹听啻渊善谋均匀堪忍够太惹妙妥妨孕症孝术室完纳推冠"
    "积宣疑辩栗碴称屈挠屑干涉衡待很忙恶忿怎么怠急耻恭息悦惑惜惟想愉愧怍慌愤启懂懈怀材才紧招认扣抵拉舍也罢插揣冒搭撞南墙"
    "扩核支攻敢雷攀敬里吗需景智暇曾罪遇朽枉止况竞争辱求愈渝溶济左右袒困补爽特寂寞示弱找谢畏强疾徐痛痒冤符眠睦瞅董何厚云"
    "措活疲羞者轻玻璃祥兆禁移稂莠稳佛换答简结果盟绝缕途给谈否羁翼耐肖胫毋宁兴舒若菲莱痕迹窠臼虚衰脸兔撒鹰棺范该详讳抬泰"
    "让须眉象众赀账费灰赖奇虑训辍辨菽麦辛近送透逞徒速续逮捕遂遑违逊斧钺艰醉锈随观弃显饱脂肪使丏丐帮丒且慢末丕替桃宗王尊"
    "凉爵各图屋脊粮署录坛吾禄职胄袭君厦丗北壑桐疹损逢陵鹬丙寅戌氨腈唑纶辰酮脱氢酶醚丞丢现掉纱帽弄扯炮碗丠両丣坐存激肩臻"
    "蒂莲悖序驱丨丩丫挺杈髻鬟细介俄伊犁京尼布订普渡央委监察检查剂圈设警队斯督剩震境航舶革防托播促质版蝾螈锋研艺历残消频"
    "谱精密制造陲邮候埔坚压坜凹汇执府究邦俘摄寮彬狼岳肺肿庸英讯诊埋粒胞括控码韩暑枪枢砥澳哇牟寿甸钻探篇签缀缝继耳肯照妇"
    "埃悬璧轴柜台辣搁浅邪跑纤阮阳私囊魔丮丰姿采丱烧丳丵丶丷丸参寨朗桂瑞砂衷霞貌凤仆舰因嫌宰峰干络牌持旨祭祷簿编罚宾办丼"
    "丿乀乂乃乄仰慕盛旷留考验阔乆乇么丑麽乊湖燃乑乒乓乕乖僻忤戾离谬迕乗危肥劫除隙浪婿乙炔肠酰吡咯盐乚乛乜嘢卿玄宫尾狐龟"
    "塔嶷兄弟泉章霄钉耙乞扎哀怜恕讨乢乣乤乥乧乨乩童乪乫乭乳晕汁液瑶浆牙癌突窦罩腐胶猪酪蛋糕菌瘤乴乵乶乷乸乹乺乼乾俸冰嘉"
    "哕嚎坤妈尸垒旱枯涸俐渴潮涩煸豆燥爹瘦瘪癣瞪袋脆姜贝隆馏乿亀亁叫咕攘扔搞男砸窜蓬麻亃亄亅却亇迟典今临繁累卵奉婚聪躬巨"
    "与迁添裂副宿岁怪恶尕仑愣杆硅硫钛铀锰芑杂异钠砷胂磺琥珀舱棍簧胡茬盗浩盆贩郎腿亍洪亐互欠助勉惠操斥诿系户译亓墓碑刑铃"
    "卅渠缤纷斗米旗宪钒灯徽瘟祖拳福谷丰脏腑绑肉腌苓蕴桥铺霸颜闹判喷冈底蛙陉矿亖亘亜罕们娜桑那努哈喀弗烈曼松森杜氏杯奥琛"
    "敦戊穆圣裔汇薛孙亟亡佚虏羊牢奋释卷卸契媾感额睫缠谊趾塞挤纽阻还配驰庄亨洛祚亪享津沪畿郊慈菴枇杷膏亭阁锃丽亳亶亹诛初"
    "责翻疯偶杰丛稠妖拖寰居吸授慧蜗吞壮魅狗矛盾益渣患忧稀描猿梦暂涯畜祸缘沸搜引擎臣横纭谁混援蒸兽狮税剖亻亼亽亡什献刹邡"
    "么仂仃仄仆富怨仈仉毕昔晨壳绍仍仏仒仕宦仗欺恃腰叹叹炬梓讫施仙后琼逝仚仝仞仟悔仡佬偿填泊拓扑簇羔购顿钦佩发棻阃驭养亿"
    "儆尤借帧赈凌叙帖李柔刚沃眦睚戒讹取飨读仨仫仮著泳卧躺韶夏裁仳仵唯贤凭钓诞仿似宋佛讽伀硕盼鹅伄儅伈伉俪柯始娃迈戈坦堡"
    "帕茨萨庙玛莉莎藤霍姆伋伍奢胥廷芳豪伎俩侍汛勒希羲雏伐憩整谟闲闲伕伙伴颐伜伝伢叔恒兹恩翰伱伲侣伶俜悧鼬伸懒缩喇叭伹伺"
    "伻伽倻辐伾似佃伫布乔妮墨佉卢佌贷劣廉昂档浓矮伞洼缓耗胸谷迷挡率龋宅沫舍疗佐贰佑占优据铧尝呢须鲁晓佗佘余坪寺瓜铳僧蒙"
    "芒陀龛哼呕坊奸孽弊揖祟茧缚誓贼佝偻瞀佟你夺赶佡佢佣佤佧贾佪佫佯佰佱洁绩酿肴佴卷佶佷佸佹佺佻佼佽佾具唤窘坏娱怒慨硬习"
    "惯聋膨胀蔓骇贵痹侀侁侂侃侄侅鸿燕侇侈糜靡侉侌妾侏儒仓鼠侐侑侔仑侘侚链侜偎傍钴循柳葫芦附価侮骂蔑侯岩截蚀局贴壶嬛宴捷"
    "携桶笺酌俣狭膝狄俅俉俊俏俎俑俓俔谚俚俛黎健呈固墒增守康箱湿祐镖镳杠盒靖膜龄俞豹猎噪孚封札筒托衍鸽剪撰稿炼厂禊练缮葺"
    "俯瞰撑冲效俳俴俵俶俷俺备俾伥倂倅储卒惶敷猝逃颉蓄崇隐倌倏忽刺蜡烛噍嚼坍扁抽毙葱楣灌灶粪背薮卖赔闭霉腾倓倔幸倘倜傥倝"
    "借箸挹浇阅倡狂倢倣値倥偬倨傲倩匡嗣冲柝珍倬倭寇猩倮倶倷倹勤赞偁偃充伪吏嗓寐惺扮拱芫茜藉虢钞偈伟晶偌宕距析滤殿疼瘫注"
    "颇偓偕鸭歇滞偝偟偢忘怡旺偨偩逼偫偭偯偰偱偲侦缉蹄偷减惰漏窥窃偸偺迹傀儡傅傈僳骂篱傎奎琳迪叟芭傒傔傕伧悉荒傜傞傢傣芽"
    "逼佣婢傮睨寄檄诵谣颂伛担辜弓惨蒿悼疤傺傻屄臆巢泄箧羡盖轧颓傿㑩僄僇佥僊働僎侨僔僖僚僝伪僣僤侥僦猴偾僩僬僭僮僯僰雇僵"
    "殖签静僾僿征陇儁侬儃儇侩朴薄儊儋儌儍傧儓俦侪拟尽儜儞儤儦儩汰哉寡渥裕酷儭儱罐儳儵儹傩俨儽兀臬臲鹫允勋勋宙宵帅憝彝谐"
    "嫂阋畅沛溢盈饥赫凶悍狠猛顽愚妣斩秦遣鞭耀敏荣槃泽爆碟磁秃缆辉霁卤朵娄孜烽酱勃汀箕裘钳耶蒙蕾彻兑软遭黜兎児韵媳爸兕觥"
    "兖兙兛兜售鍪肚兝兞兟兡兢兣樽殓涅睡禀籍赘泌啡肽奸幕涵涝熵疚眷稃衬讧赴焕椒歼植跏没试误猜栖窗肋袖颊兪卦撇胡岐廓轿疸枫"
    "茴珑厕秩募勺吨寓斤历亩迫筷厘最淫螺韬兮宽匪筛襄赢轭复兲诈刃堰戎痞蚁饷它冀铸冂冃円冇冉册嫁厉砺竭醮冏牧冑冓冔冕冖冗冘"
    "冞冢窄抑诬冥冫烘菇蛰冷凝坨橇淇淋炭饼砖碛窖醋雕雹霜冱冶炉艳嘲峻滩淡漠煖飕饮冼冽凃凄怆梗凅凇净凊凋敝蒙凔凛遵汞脢凞几"
    "凢処凰凯凵凶焰凸折刷纹预丧喽奔巡榜殡芙蓉租笼辑鞘萃凼锯镬刁蛮刂娩崩批拆摊掰蘖骤歧颗秒袂赃勿嘱忌磋琢肤刈羽刎讼戮舂桨"
    "艇刓刖霹雳刜创犊刡恙墅帜筵致劫劫刨昏默攸尿欲熏润薰圭删刮痧铲刱刲刳刴刵踏磅戳柏槐绣芹苋猬舟铭鹄鹜劫剁剃辫刭锉履铅克"
    "剌姻咽哨廊掠桅沿召瞻翅赵卜渺茫郭剒剔剕沥剚愎毅讷才剜剥啄采剞剟剡剣剤䌽剐肾驶黏剰袍剀紊铲剸剺剽剿劁劂札劈啪柴扳啦刘"
    "奭姥夼昫涓熙禅禹锡翔雁鹗刽刿弩柄蜻蛉劒劓劖劘劙澜篑赏矶釜晋甜薪逐劦熔纣虐赤囚劬劭労劵效劻劼劾峭艮勅勇励勍勐腊脖庞漫"
    "饲荡粥辄勖勗勘骄馁碌泮雇捐竹骑殊阱绩朴恳谨剿勧勩勯勰劢勋勷劝惩慰诫谏勹芡践阑匁庇拯粟扎袱裹饺匆遽匈匉匊匋匍匐茎匏匕"
    "妆痰脓蛹斋苑烤蹈塘羌熊阀螳螂疆碚竿纬荷茵邙魏匚匜匝匟扶稷匣匦拢匸匹耦匽匾匿卂叮疮禧轸堤棚迢钧炼卄卆遐卉瓷盲瓶当胱腱"
    "裸卋卌卍卐怯污贱鄙龌龊陋卓溪唐梯渔陈枣泥漳浔涧梨芬谯赡辕迦郑単驴弈洽鳌卛占筮卝卞卟吩啉屎翠厄卣卨卪卬卮榫袄玺绶钮蚤"
    "惧殆笃耸卲帘帙绕恤卼卽厂厎厓厔厖厗奚厘厍厜厝谅厕厤厥厪腻孢厮厰厳厣厹厺粕垢芜菁厼厾叁悟茸薯叄吵笄悌哺讥坫垄弧芯杠潜"
    "婴刍袁诘贪谍煽馈驳収岳缔灾贿骗叚叡吻拦蘑蜜诀燧玩砚筝椎蔺铜逗骊另觅叨唠谒杵姓喊嚷嚣咚咛塑寻恼憎擦只泣渗蝠叱吒咄咤喝"
    "籀黛舵舷叵叶铎懿昭穰苴辽叻叼吁堑嫖赌瞧爬众抒吅吆夥卺橡涤抱纵摩郡唁坠扇篮膀袜颈吋忾谘酬哭妓媛暗表缰迩妃羿絮蕃浑拐葵"
    "暮隅吔吖啶嗪戚吜啬噬咽吟哦咏吠吧唧嗒咐吪隽咀征燐苞茹钙哧吮吰吱嘎吲哚吴栋娇窟孟箫忠晗淞阖闾趼宇呐睛嘘拂捧疵熄竽笛糠"
    "吼吽呀吕韦蒙呃呆笨呇贡呉罄呋喃呎呏呔呠呡痴呣呤呦呧瑛眩扒晬淑姬瑜璇鹃呪呫哔嚅嗫呬呯呰呱呲咧噌钝呴呶呷呸呺呻哱咻啸噜"
    "吁坎坷逻呿咁咂咆哮咇咈咋蟹煦珅蔼咍咑咒诅咔哒嚓咾哝哩喱咗咠咡咢咣咥咦咨嗟询咩咪咫啮啮咭咮咱咲咳呛嗽咴啕咸咹咺呙喉咿"
    "婉恸悯赋矜绿茗蓝哂抢瞒哆嗦啰噻啾滨彗哋哌哎唷哟哏哐哞哢哤哪里哫啼喘哰哲萎蚌哳咩哽哿呗唅唆唈唉唎唏哗尧棣殇璜睿肃唔睇"
    "唕吣唞唣喳唪唬唰喏唲唳唵嘛唶唸唹唻唼唾唿啁啃鹦鹉啅埠栈榷祺铺鞅飙啊啍啎啐啓啕啖啗啜哑祈啢衔啤啥啫啱啲啵啺饥啽噶昆沁"
    "喁喂喆裙喈咙喋喌喎喑喒喓喔粗喙幛庆滋鹊喟喣喤喥喦喧骚喨喩梆吃葡萄喭驼挑吓碰枞瓣纯疱藻趟铬喵営喹喺喼喿嗀嗃嗄嗅嗈嗉嗊"
    "嗍嗐嗑嗔诟嗕嗖嗙嗛嗜痂癖嗝嗡嗤嗥嗨唢嗬嗯嗰嗲嗵叽嗷嗹嗾嗿嘀嘁嘂嘅惋嘈峪禾荫啀嘌嘏嘐嘒啯啧嘚唛嘞嘟囔嘣嘥嘦嘧嘬嘭这谑"
    "严敞馋松哓嘶嗥呒虾嘹嘻啴嘿噀噂噅噇噉噎噏噔噗噘噙噚咝噞噢噤蝉皿噩噫噭嗳噱哙噳嚏涌洒欲巫霏噷噼嚃嚄嚆抖哜尝嚔苏嚚嚜嚞"
    "嚟呖嚬嚭嚮嚯亸喾饬按竣苛嚵嘤啭冁呓膪谦囍囒囓囗囘萧酚飘溅谛囝溯眸纥銮鹘囟殉囡団囤囥囧囨囱囫囵囬囮囯囲図囶囷囸囹圄圉"
    "拟囻囿圀圂圃圊粹蠹赦圌垦圏滚鲱凿枘圕圛圜圞坯埂壤骸炕祠窑豚绅魠鲮鳖圧握圩圪垯圬圮圯炸岬幔毯祇窨菩溉圳圴圻圾坂坆沾坋"
    "坌舛壈昆垫墩椅坒坓坩埚坭坰坱坳坴坵坻坼杨挣涎帘垃垈垌垍垓垔垕垗垚垛垝垣垞垟垤垧垮垵垺垾垿埀畔埄埆埇埈埌殃隍埏埒埕埗"
    "埜垭埤埦埧埭埯埰埲埳埴埵埶绋埸培怖桩础辅埼埽堀诃侄庑堃堄摧磐贞韧砌堈堉垩堋堌堍堎垴堙堞堠礁堧堨舆堭堮蜓摘堲堳堽堿塁"
    "塄塈煤茔棵塍垲埘塓绸塕鸦沽虱塙冢塝缪塡坞埙塥塩塬塱场螨塼塽塾塿墀墁墈墉墐夯増毁墝墠墦渍钵墫墬堕墰墺墙橱壅壆壊壌壎壒"
    "榨蒜壔壕壖圹垆壜壝垅壡壬壭壱売壴壹壻壸寝壿夂夅夆変夊夌漱邑夓腕泄甥御骼夗夘夙衮瑙妊娠醣枭珊莺鹭戗幻魇夤蹀秘擂鸫姚宛"
    "闺屿庾挞拇賛蛤裨菠氅漓捞湄蚊霆鲨箐篆篷荆肆舅荔鲆巷惭骰辟邱镕镰阪漂烩鲵鲽鳄鸨胪鹏妒峨谭枰晏玑癸祝秤竺牡籁恢罡蝼蝎赐"
    "绒御梭夬夭砣榆怙枕夶夹馅奄崛葩谲奈贺祀赠奌奂奓奕䜣詝奘奜奠奡奣陶奨奁魁奫奬奰娲孩贬隶酥宄狡猾她姹嫣妁毡荼皋膻蝇嫔妄"
    "妍嫉媚娆妗趣妚妞妤碍妬娅妯娌妲妳妵妺姁姅姉姗姒姘姙姜姝姞姣姤姧姫姮娥姱姸姺姽婀娀诱慑胁娉婷娑娓娟娣娭娯娵娶娸娼婊婐"
    "婕婞婤婥溪孺婧婪婬婹婺婼婽媁媄媊媕媞媟媠媢媬媮妫媲媵媸媺媻媪眯媿嫄嫈袅嫏嫕妪嫘嫚嫜嫠嫡嫦嫩嫪毐嫫嫬嫰妩嫺娴嫽嫿妫嬃"
    "嬅嬉耍婵痴艳嬔嬖嬗嫱袅嫒嬢嬷嬦嬬嬭幼嬲嬴婶嬹嬾嬿孀娘孅娈孏曰癫屏孑孓雀孖斟篓谜摺孛矻鸠崮轲祜鸾孥邈毓棠膑孬孭孰孱孳"
    "孵泛罔衔孻孪宀宁冗拙株薇掣抚琪瓿榴谧弥宊濂祁瑕宍宏碁宓邸谳実潢町宥宧宨宬徵崎骏掖阙臊煮禽蚕宸豫寀寁寥寃檐庶寎暄碜寔"
    "寖寘寙寛寠苫寤肘洱滥蒗陕核寪弘绰螽宝擅疙瘩晷対檐専尃尅赎绌缭畴衅尌峙醌襟痲碧屁昊槌淘恵瀑牝畑莓缸羚觑蔻脏躁尔尓锐尗"
    "尙尜尟尢尥尨尪尬尭尰擒尲尶尴尸尹潽蠖蛾尻扣梢蚴鳍脬蹲屇屌蚵屐屃挪屖屘屙屛屝屡屣峦嶂岩舄屧屦屩屪屃屮戍驻钾崖嵛巅旮旯"
    "楂榄榉芋茱萸靛麓屴屹屺屼岀岊岌岍阜岑彭巩岒岝岢岚岣岧岨岫岱岵岷峁峇峋峒峓峞峠嵋峨峰峱岘峹峿崀崁崆祯崋崌崃岖昆崒崔嵬"
    "巍萤颢崚崞崟崠峥巆崤崦崧殂岽崱崳崴崶崿嵂嵇嵊泗嵌嵎嵒嵓岁嵙嵞嵡嵩嵫嵯嵴嵼嵾嵝崭崭晴嶋嶌嶒嶓嵚崂嶙嶝嶞峤嶡嶢峄嶨嶭嶮"
    "嶰嶲岙嵘巂巃巇巉岿巌巓巘巛滇芎巟巠弋回巣巤炊擘蜥蟒蛊觋巰蜀彦淖杏茂甫楞巻巽帼巿帛斐鲫蕊帑帔帗帚琉汶帟帡帣帨裙帯帰帷"
    "帹暆帏幄帮幋幌幏帻幙帮幞幠幡幢幦幨幩幪帱幭幯幰遥蹉跎馀庚鉴幵幷稚邃庀庁広庄庈庉笠庋跋庖牺庠庤庥鲸庬庱庳庴庵馨衢庹庿"
    "廃厩廆廋廌廎廏廐廑廒荫廖廛厮搏锣廞弛袤廥廧廨廪廱绵踵髓廸迫瓯邺廻廼廾廿躔弁皱弇弌弍弎弐弑吊诡憾荐弝弢弣弤弨弭弮弰弪"
    "霖繇焘斌旭溥骞弶弸弼弾彀彄别累纠强彔彖彘彟彟陌彤贻彧绘虹彪炳雕蔚鸥彰瘅彲彳彴仿彷徉徨彸彽踩敛旆徂徇徊渭畲铉裼従筌徘"
    "徙徜徕膳苏萌渐徬徭醺徯徳徴潘徻徼忀瘁胖燎怦悸颤扉犀澎湃砰恍惚绞隘忉惮挨饿忐忑忒忖応忝忞耿忡忪忭忮忱忸怩忻悠懑怏遏怔"
    "怗怚怛怞怼黍讶怫怭懦怱怲恍怵惕怸怹恁恂恇恉恌恏恒恓恔恘恚恛恝恞恟恠恣恧眄恪恫恬澹恰恿悀悁悃悄悆悊悐悒晦悚悛悜悝悤您"
    "悩悪悮悰悱凄恻德悴怅惘闷悻悾惄愫钟蒐惆惇惌惎惏惓惔惙惛耄惝疟浊恿惦德恽惴蠢惸拈愀愃愆愈愊愍愐愑愒愓愔愕恪氓蠢騃昵惬"
    "赧悫愬愮愯恺愼慁恿慅慆慇霭慉慊愠慝慥怄怂慬慱悭慴慵慷戚焚憀灼郁憃惫憋憍眺捏轼愦憔憖憙憧憬憨憪憭怃憯憷憸憹憺懃懅懆邀"
    "懊懋怿懔懐懞懠懤懥恹懫懮懰懱毖懵遁梁雍忏懽戁戄戆戉戋戕戛戝戛戠戡戢戣戤戥戦戬戭戯轰戱披菊牖戸戹戺戻卯戽锹扂楔扃扆扈"
    "扊杖牵绢铐镯赉扐搂搅烊盹瞌跟趸镲靶鼾払扗玫腮扛扞扠扡扢盔押扤扦扱罾揄绥鞍郤窾扻扼扽抃抆抈抉抌抏瞎抔缳缢擞抜拗択抨摔"
    "歉蹿牾抶抻搐泵菸拃拄拊髀抛拌脯拎拏拑擢秧沓曳挛迂拚拝拠拡拫拭拮踢拴拶拷攒拽掇芥橐簪摹疔挈瓢骥捺蹻挌挍挎挐拣挓挖掘浚"
    "挙揍聩挲挶挟挿捂捃捄捅捆捉捋胳膊揎捌捍捎躯蛛捗捘捙捜捥捩扪捭据捱捻捼捽掀掂抡臀膘掊掎掏掐笙掔掗掞棉芍掤搪阐掫掮掯揉"
    "掱掲掽掾揃揅揆搓揌诨揕揗揘揜揝揞揠揥揩揪揫橥遒麈揰揲揵揶揸背揺搆搉搊搋搌搎搔搕撼橹捣搘搠搡搢搣搤搥搦搧搨搬楦裢讪赸"
    "掏搰搲搳搴揾搷搽搾搿摀摁摂摃摎掴摒摓跤摙摛掼摞摠摦喉羯摭摮挚摰摲抠摴抟摷掺摽撂撃撅稻撊撋挦锏泼撕撙撚㧑挢撢掸撦撅撩"
    "撬撱朔揿蚍蜉挝捡擀掳闯擉缶觚擐擕擖擗擡擣擤澡腚擧擨擩擫擭摈拧撷擸撸擽擿攃摅撵攉攥攐攓撄搀撺每攩攫辔澄攮攰攲攴轶攷砭"
    "讦攽碘敁敃敇敉叙敎筏敔敕敖闰诲敜煌敧敪敳敹敺敻敿斁衽斄牒绉诌斉斎斓鹑谰驳鳢斒筲斛斝斞斠斡斢斨斫斮晾沂潟颖绛邵斲斸釳"
    "於琅斾斿旀旗旃旄涡旌旎旐旒旓旖旛旝旟旡旣浴旰獭魃旴时旻旼旽昀昃昄昇昉晰躲澈熹皎皓矾昑昕昜昝昞昡昤晖笋昦昨是昱昳昴昶"
    "昺昻晁蹇隧蔬髦晄晅晒晛晜晞晟晡晢晤晥曦晩萘莹顗晿暁暋暌暍暐暔暕煅旸暝暠暡曚暦暨暪朦胧昵暲殄冯暵暸暹暻暾曀晔昙曈曌曏"
    "曐暧曘曙曛叠昽曩骆曱甴肱曷牍禺锟曽沧耽朁朅朆杪栓夸竟粘绦朊膺朏朐朓朕朘朙瞄觐溘饔飧朠朢朣栅椆淀虱朩朮朰朱炆璋钰炽鹮"
    "朳槿朵朾朿杅杇杌陧欣钊湛漼楷瀍煜玟缨翱肇舜贽适逵杓杕杗杙荀蘅杝杞脩珓筊杰榔狍閦颦缅莞杲杳眇杴杶杸杻杼枋枌枒枓衾葄翘"
    "纾逋枙狸桠枟槁枲枳枴枵枷枸橼枹枻柁柂柃柅柈柊柎某柑橘柒柘柙柚柜柞栎柟柢柣柤柩柬柮柰柲橙柶柷柸柺査柿栃栄栒栔栘栝栟柏"
    "栩栫栭栱栲栳栴檀栵栻桀骜桁镁桄桉桋桎梏椹葚桓桔桕桜桟桫椤桭杯桯桲桴桷桹湘溟梃梊梍梐潼栀枧梜梠梡梣梧梩梱梲梳梴梵梹棁"
    "棃樱棐棑棕榈簑绷蓑枨棘棜棨棩棪棫棬棯棰棱棳棸棹椁棼碗椄苕椈椊椋椌椐椑椓椗検椤椪椰椳椴椵椷椸椽椿楀匾楅篪楋楍楎楗楘楙"
    "楛楝楟楠楢楥桢楩楪楫楬楮楯楰梅楸楹楻楽榀榃榊榎槺榕榖榘榛狉莽榜笞榠榡榤榥榦榧杩榭榰榱梿霰榼榾桤槊闩槎槑槔槖様槜槢槥"
    "椠槪槭椮槱槲槻槼槾樆樊樏樑樕樗樘樛樟樠樧樨権樲樴樵猢狲桦樻罍樾樿橁橄橆桡笥龠橕橚橛辆椭橤橧竖膈跨橾橿檩檃檇柽檍檎檑"
    "檖檗桧槚檠樯檨檫檬梼槟檴檵柠棹櫆櫌栉櫜椟櫡槠栌枥榇栊櫹棂茄櫽欀欂欃欐欑栾欙棂溴欨欬欱欵欶欷歔欸欹欻欼欿歁歃歆艎歈歊"
    "莳蝶歓歕歘歙歛歜欤歠蹦诠镶蹒跚升陟歩歮歯歰歳歴璞歺瞑歾殁夭殈殍殑殗殜殙殛殒殢殣殥殪殚僵殰殳荃殷殸殹蛟殻肴谤殴毈毉喂"
    "毎毑蕈毗毘毚茛邓毧毬毳毷毹毽毾毵牦氄氆靴氉氊氇氍氐聊氕氖気氘氙氚氛氜氝氡汹焊痉氤氲氥氦铝锌氪烃氩铵痤汪浒漉痘盂碾菖"
    "蒲蕹蛭螅氵冰氹氺氽烫氾氿渚汆汊汋汍汎汏汐汔汕褟汙汚汜蓠沼秽蔑汧汨汩汭汲汳汴堤汾沄沅沆瀣沇沈葆浸沦湎溺痼疴沌沍沏沐沔"
    "沕沘浜畹砾沚沢沬沭沮沰沱灢沴沷籽沺烹濡洄泂肛泅泆涌肓泐泑泒泓泔泖泙泚泜泝泠漩馍涛粼泞藓鳅泩泫泭泯铢泱泲洇洊泾琵琶荽"
    "蓟箔洌洎洏洑潄濯洙洚洟洢洣洧洨洩痢滔洫洮洳洴洵洸洹洺洼洿淌蜚浄浉浙赣渫浠浡浤浥淼瀚浬浭翩萍浯浰蜃淀苔蛞蝓蜇螵蛸煲鲤"
    "浃浼浽溦涂涊涐涑涒涔滂莅涘涙涪涫涬涮涴涶涷涿淄淅淆淊凄黯淓淙涟淜淝淟淠淢淤渌淦淩猥藿亵淬淮淯淰淳诣涞纺淸淹炖癯绮渇"
    "済渉渋渓渕涣渟渢滓渤澥渧渨渮渰渲渶渼湅湉湋湍湑湓湔黔湜湝浈湟湢湣湩湫湮麟湱湲湴涅満沩溍溎溏溛舐漭溠溤溧驯溮溱溲溳溵"
    "溷溻溼溽溾滁滃滉滊荥滏稽滕滘汇滝滫滮羼耷卤滹浐煎漈漊漎绎漕漖漘漙沤漜漪漾漥漦漯漰溆漶漷濞潀颍潎潏潕潗潚潝潞潠潦祉疡"
    "潲潵滗潸潺潾涠澁澂澃澉澌澍澐澒澔澙渑澣澦澧澨澫澬浍澰澴澶澼熏郁濆濇濈濉濊貊濔疣濜濠濩觞浚濮盥潍濲泺瀁滢渎渖瀌浏瀒瀔"
    "濒泸瀛潇潆瀡潴泷濑瀬弥潋瀳瀵瀹瀺瀼沣滠灉灋灒漓灖灏灞灠滦灥灨滟灪蜴灮烬獴灴灸灺炁炅鱿炗炘炙炤炫疽烙钎炯炰炱炲炴炷毁"
    "炻烀烋瘴鲳烓烔焙烜烝烳饪烺焃焄耆焌焐焓焗焜焞焠焢焮焯焱焼煁煃煆煇煊熠煍熬煐炜煕暖熏硷霾煚煝煟煠茕矸煨琐炀萁煳煺煻熀"
    "熅熇熉罴荧穹炝熘熛熜稔谙烁熤熨熯熰眶蚂颎熳熸熿燀烨燂燄盏燊燋燏燔隼燖焖燠燡灿燨燮燹燻燽燿爇爊爓爚爝爟爨蟾爯爰为爻丬"
    "爿牀牁牂牄牋窗牏牓窗釉牚腩蒡虻牠虽蛎牣牤牮牯牲牳牴牷牸牼绊牿靬犂犄犆犇犉犍犎犒荦犗犛犟犠犨犩犪犮犰狳犴犵犺狁甩狃狆"
    "狎狒獾狘狙黠狨狩狫狴狷狺狻豕狈蜘猁猇猈猊猋猓猖獗猗猘狰狞犸猞猟獕猭猱猲猳猷猸猹猺玃獀獃獉獍獏獐獒毙獙獚獜獝獞獠獢獣"
    "獧鼇蹊狯猃獬豸狝獯鬻獳犷猕猡玁菟玅玆玈珉糁禛郅玍玎玓瓅玔玕玖玗玘玞玠玡玢玤玥玦珏瑰玭玳瑁玶玷玹玼珂珇珈瑚珌馐馔珔珖"
    "珙珛珞珡珣珥珧珩珪佩珶珷珺珽琀琁陨玡琇琖琚琠琤琦琨琫琬琭琮琯琰琱琲琅琴珐珲瑀瑂瑄瑉玮瑑瑔瑗瑢瑭瑱瑲瑳瑽瑾瑿璀璨璁璅"
    "璆璈琏璊璐璘璚璝璟璠璡璥瑷璩璪璫璯璲玙璸璺璿瓀璎瓖瓘瓒瓛脐瓞瓠瓤瓧瓩瓮瓰瓱瓴瓸瓻瓼甀甁甃甄甇甋甍甎甏甑甒甓甔瓮甖甗"
    "饴蔗甙诧钜粱盎锈团甡褥産甪甬甭甮宁铠甹甽甾甿畀畁畇畈畊畋畎畓畚畛畟鄂畤畦畧荻畯畳畵畷畸畽畾疃叠疋疍疎箪疐疒疕疘疝疢"
    "疥疧疳疶疿痁痄痊痌痍痏痐痒痔痗瘢痚痠痡痣痦痩痭痯痱痳痵痻痿瘀痖瘃瘈瘉瘊瘌瘏瘐痪瘕瘖瘙瘚瘛疭瘜瘝瘗瘠瘥瘨瘭瘆瘯瘰疬瘳"
    "疠瘵瘸瘺瘘瘼癃痨痫癈癎癐癔癙癜癠疖症癞蟆癪瘿痈発踔绀蔫酵皙砬砒翎翳蔹钨镴皑鹎驹暨粤褶皀皁荚皃镈皈皌皋皒朱皕皖皘皜皝"
    "皞皤皦皨皪皫皭糙绽皴皲皻皽盅盋碗盍盚盝踞盦盩秋千盬盭眦睁瞤盯盱眙裰盵盻睐眂眅眈眊県眑眕眚眛眞眢眣眭眳眴眵眹瞓眽郛睃"
    "睅睆睊睍睎困睒睖睙睟睠睢睥睪睾睯睽睾眯瞈瞋瞍逛瞏瞕瞖眍䁖瞟瞠瞢瞫瞭瞳瞵瞷瞹瞽阇瞿眬矉矍铄矔矗矙瞩矞矟矠矣矧矬矫矰矱"
    "硪碇磙罅舫阡、矼矽礓砃砅砆砉砍砑砕砝砟砠砢砦砧砩砫砮砳艏砵砹砼硇硌硍硎硏硐硒硜硖砗磲茚钡硭硻硾碃碉碏碣碓碔碞碡碪碫"
    "碬砀碯碲砜碻礴磈磉磎硙磔磕磖磛磟磠磡磤磥蹭磪磬磴磵磹磻硗礀硚礅礌礐礚礜礞礤礧礮砻礲礵礽礿祂祄祅祆禳祊祍祏祓祔祕祗祘"
    "祛祧祫祲祻祼饵脔锢禂禇禋祦禔祎隋禖禘禚禜禝禠祃禢禤禥禨禫祢禴禸秆秈秊闱飒秋秏秕笈蘵赁秠秣秪秫秬秭秷秸稊稌稍稑稗稙稛"
    "稞稬秸稲稹稼颡稿穂穄穇穈穉穋稣贮穏穜穟秾穑穣穤穧穨穭穮穵穸窿阒窀窂窅窆窈窕窊窋窌窒窗窔窞窣窬黩蹙窑窳窴窵窭窸窗竁竃"
    "竈竑竜并竦竖篦篾笆鲛竾笉笊笎笏笐靥笓笤箓笪笫笭笮笰笱笲笳笵笸笻筀筅筇筈筎筑筘筠筤筥筦笕筒筭箸筰筱筳筴宴筸箂个箊箎箑"
    "箒箘箙箛箜篌箝箠箬镞箯箴箾篁筼筜篘篙篚篛篜篝篟篠篡篢篥篧篨篭篰篲筚篴篶篹篼箦簁簃簆簉簋簌簏簜簟簠簥簦簨簬簰簸簻籊藤"
    "籒籓籔签籚篯箨籣籥籧笾簖籫籯芾麴籵籸籹籼粁秕粋粑粔粝粛粞粢粧粨粲粳稗粻粽辟粿糅糆糈糌糍糒糔萼糗蛆蹋糢糨糬粽糯糱籴粜"
    "糸糺紃蹼鲣霉纡纨绔纫闽襻紑纰纮锭鸢鹞纴紞紟扎紩紬绂绁纻紽紾绐絁絃絅経絍绗絏缡褵絓絖絘絜绚絣螯絪絫聒絰絵绝絺絻絿綀绡"
    "綅绠绨绣綌綍綎捆綖綘継続缎绻綦綪线綮綯绾罟蝽綷縩绺绫緁绲緅緆缁绯緌緎総緑绱緖缃缄缂绵缗緤褓缌纂緪緰缑缈缏缇縁縃縄萦"
    "缙缒縏缣縕缞縚缜缟缛縠縡縢縦绦縯縰骋缧縳纤缦絷缥縻衙縿繄缫繈繊繋繐缯繖繘繙繠缋繣繨缰缲繸繻缱纁纆纇缬缵纩纑纕缵纙纚"
    "纛缾罃罆坛罋罂罎罏罖罘罛罝罠罣罥罦罨罫罭锾罳罶罹罻罽罿羂羃羇芈蕉５１鸵羑羖羌羜羝羢羣羟羧羭羮羰羱羵羶羸藜鲐翀翃翅翊"
    "翌翏翕翛翟翡翣翥翦跹翪翫翚翮翯翱翽翾翿板饕鸹锨耋耇耎耏专耒耜耔耞耡耤耨耩耪耧耰鬓耵聍聃聆聎聝聡聦聱聴聂聼阈聿肄肏肐"
    "肕腋肙肜肟肧胛肫肬肭肰肴肵肸肼胊胍胏胑胔胗胙胝胠铨胤胦胩胬胭胯胰胲胴胹胻胼胾脇脘脝脞脡脣脤脥脧脰脲脳腆腊腌臜腍腒腓"
    "胨腜腠脶腥腧腬腯踝蹬镣腴腶蠕诽膂腽嗉膇膋膔腘膗膙膟黐膣膦膫膰膴膵膷脍臃臄臇臈臌臐臑臓膘臖臙臛臝臞臧蓐诩臽臾臿舀舁鳑"
    "鲏舋舎舔舗馆舝舠舡舢舨舭舲舳舴舸舺艁艄艅艉艋艑艕艖艗艘艚艜艟艣舣艨艩舻艬艭荏艴艳艸艹艻艿芃芄芊萰陂藭芏芔芘芚蕙芟芣"
    "芤茉芧芨芩芪芮芰鲢芴芷芸荛豢芼芿苄苒苘苙苜蓿苠苡苣荬苤苎苪镑苶苹苺苻苾茀茁范蠡萣茆茇茈茌茍茖茞茠茢茥茦菰茭茯茳藨茷"
    "藘茼荁荄荅荇荈菅蜢鸮荍荑荘豆荵荸荠莆莒莔莕莘莙莚莛莜莝莦莨菪莩莪莭莰莿菀菆菉菎菏菐菑菓菔芲菘菝菡菢菣菥蓂菧菫毂蓥菶"
    "菷菹醢菺菻菼菾萅萆苌萋萏萐萑萜萩萱萴莴扁萻葇葍葎葑荭葖葙葠葥苇葧葭药葳葴葶葸葹葽蒄蒎莼茏薹莅蒟蒻蒢蒦蒨蒭藁蒯蒱鉾蒴"
    "蒹蒺蒽荪蓁蓆蓇蓊蓌蓍蓏蓓蓖蓧蓪蓫荜跣藕苁蓰蓱莼蓷蓺蓼蔀蔂蔃蔆蔇蔉蔊蔋蔌蔎蔕蔘蔙蒌蔟锷蒋雯茑蔯蔳麻蔵蔸蔾荨蒇蕋蕍荞蕐"
    "蕑芸莸蕖蕗蕝蕞蕠蕡蒉蕣蕤蕨蕳蓣蕸蕺蕻薀薁薃薅薆荟薉芗薏薐蔷薖薘剃谔钗薜薠薢薤薧薨薫薬薳薶薷薸薽薾薿藄藇藋荩藐藙藚藟"
    "藦藳藴苈藷藾蘀蘁蕲苹蘗蘘蘝蘤蘧蘩蘸蘼虀虆虍蟠虒虓虖虡虣虥虩虬虰蛵蛇虷鳟虺虼蚆蚈蚋蚓蚔蚖蚘蚜蚡蚣蚧蚨蚩蚪蚯蚰蜒蚱蚳蚶"
    "蚹蚺蚻蚿蛀蛁蛄蛅蝮蛌蛍蛐蟮蛑蛓蛔蛘蛚蛜蛡蛣蜊蛩蛱蜕螫蜅蚬蜈蝣蜋蜍蜎蜑蠊蜛饯蜞蜣蜨蜩蜮蜱蜷蜺蜾蜿蝀蝃蝋蝌蝍蝎蝏蝗蝘蝙"
    "蝝鲼蝡蝤蝥猿蝰虻蝲蝴蝻螃蠏蛳螉螋螒螓螗螘螙螚蟥螟螣螥螬螭䗖螾螀蟀蟅蝈蟊蟋蟑蟓蟛蟜蟟蟢虮蟨蟪蟭蛲蟳蛏蟷蟺蟿蠁蠂蠃虿蠋"
    "蛴蠓蚝蠗蠙蠚蠛蠜蠧蟏蠩蜂蠮蠰蠲蠵蠸蠼蠽衁衄衄衇衈衉衋衎衒同衖胡衞裳钩衭衲衵衹衺衿袈裟袗袚袟袢袪袮袲袴袷袺袼褙袽裀裉"
    "袅裋夹裍裎裒裛裯裱裲裴裾褀褂褉褊裈褎褐褒褓褔褕袆褚褡褢褦褧褪褫袅褯褰褱裆褛褽褾襁褒襆裥襉襋襌襏襚襛襜裣襞襡襢褴襦襫"
    "襬襭襮襕襶襼襽襾覂覃覅霸覉覊覌覗觇覚覜觍觎覧覩觊觏覰観觌觔觕觖觜觽觝觡酲觩觫觭觱觳觯觷觼觾觿言赅讣訇訏訑訒诂讬訧訬"
    "訳訹证訾詀詅诋毁詈詊讵詑诒诐詗诎察詨诜詶詸詹詻诙诖誂誃诔锄诓誋诳诶悖誙诮诰誧説読誯谇訚谄谆諆諌诤诹诼諕谂谀諝谝諟喧"
    "谥諴諵谌谖誊謆謇歌謍謏謑谡谥謡謦謪谪讴謷謼谩哗譅譆譈譊讹譒撰谮鑫譞噪譩谵譬譱譲谴譸譹谫讅讆詟䜩雠讐谗谶讙谠讟谽豁豉"
    "豇岂豊豋豌豏豔豞豖豗豜豝豣豦豨豭豱豳豵豶豷豺豻貅貆狸猊貔貘䝙貜貤餍贳餸贶贲赂賏赊赇赒賝赓赕賨赍斗賮賵賸赚赙赜赟贉赆"
    "赑贕赝赬赭赱赳迄趁趂趄趐趑趒趔趡趦趫趮趯趱趴趵趷趹趺趿跁跂跅跆踬跄跐跕跖跗跙跛跦跧跩跫跬跮跱跲跴跺跼跽踅踆踈踉踊踒"
    "踖踘踜踟躇蹰踠踡踣踤踥踦踧跷踫踮逾踱踊踶踹踺踼踽躞蹁蹂躏蹎蹐蹓蹔跸蹚蹜蹝迹蹠蹡蹢跶蹧蹩蹪蹯鞠蹽躃躄躅踌跻躐踯跞躘躙"
    "躗躝躠蹑躜躧躩躭躰躬躶軃軆辊軏轫軘軜軝腭転軥軨軭軱轱辘軷轵轺軽軿輀輂辇辂辁輈挽輗辄辎辋輠輤輬輭輮辏輴輵輶輹輼辗辒轇"
    "轏轑轒辚轕轖轗轘轙轝轞轹轳罪辣辞辵辶辺込辿迅迋迍麿迓迣迤逦迥迨迮迸迺迻迿逄逅逌逍逑逓迳逖逡逭逯逴逶逹遄遅侦遘遛遝遢"
    "遨遫遯遰遴绕遹遻邂邅邉邋邎邕邗邘邛邠邢邧邨邯郸邰邲邳邴邶邷邽邾邿郃郄郇郈郔郕郗郙郚郜郝郞郏郠郢郪郫郯郰郲郳郴郷郹郾"
    "郿鄀鄄郓鄇鄈鄋鄍鄎鄏鄐鄑邹邬鄕郧鄗鄘鄚鄜鄞鄠鄢鄣鄤鄦鄩鄫鄬鄮鄯鄱郐鄷鄹邝鄻鄾鄿酃酅酆酇郦酊酋酎酏酐酣酔酕醄酖酗酞酡"
    "酢酤酩酴酹酺醁醅醆醊醍醐醑醓醖醝酝醡醤醨醪醭醯醰酦醲醴醵醸醹醼醽醾釂酾酽釆釈鲈镏阊钆钇钌钯钋鼢鼹钐钏釪釬釭釱钍釸钕"
    "钫鈃钭鈆鈇钚鈊鈌钤钣鈒鈤钬钪鈬铌铈钶铛钹铍钸钿鉄鉆铊铇鉌铋鉏铂钷铆钵鉥钲鉨钼钽鉱鉲鉶铰铒鉼铪銍銎铣銕镂铫铦铑铷銤铱"
    "铟銧铥铕铯銭銰焊銶锑锉汞鋂锒鋆鋈鋊铤鋍铗鋐鋑鋕鋘鋙锊锓锔锇铓鋭铖锆锂铽鋳鋹鋺鉴镚钎錀锞锖锫锩錍铔锕錔锱铮锛錞锬锜錤"
    "錩錬録铼錼锝钔锴鍉镀鍏鍐铡鍚锻锽锸锲锘鍫鍭鍱鍴锶鍹锗针锺锿镅鎉鎋鎌鎍鎏鎒鎓鎗镉鎚鎞镃鎤铩锼鎭鎯镒镍鎴镓鎸鎹镎镟鏊镆"
    "镠镝鏖铿锵鏚镗镘镛鏠鏦錾镤鏸镪鏻鏽鏾铙鐄鐇鐏铹镦镡鐗馗镫镢镨鐡锎镄鐩镌鐬鐱镭鐶鐻鐽镱鑀鑅镔鑐鑕鑚鑛鑢鑤镥鑪镧鑯鑱鑴"
    "鑵镊镢钃镻闫闬闶闳閒闵閗閟阂関合閤哄阆閲阉閺阎阏阍阌暗闉阕阗闑闒闿闘闚阚闟闠闤闼阞阢阤阨阬阯阹阼阽陁陑陔陛陜陡陥陬"
    "骘陴険陼陾阴隃隈隒隗隞隠隣隤隩隮隰颧隳隷隹雂雈雉雊雎雑雒雗雘雚雝雟雩雰雱驿霂霅霈霊沾霒霓霙霝霢霣霤霨霩霪霫霮靁叇叆"
    "靑靓靣腼靪靮靰靳靷靸靺靼靿鞀鞃鞄鞍鞗鞙鞚鞝鞞鞡鞣鞨鞫鞬鞮鞶鞹鞾鞑韅鞯驮韍韎韔韖韘韝韫韡韣韭韭韱韹韺頀刮頄顸顼頍颀颃"
    "颁頖頞頠頫頬颅頯頲颕頼悴顋顑颙颛颜顕顚顜颟顣颥颞飐飑台飓颸飏飖颽颾颿飀飂飚飌翻飡飣饲飥饨饫飮飧飶餀餂饸饹餇餈饽哺馂"
    "餖餗餚馄馃餟餠餤餧餩餪餫糊餮糇餲饧馎糕饩馈馊馌馒饇馑馓膳饎饐饘饟馕馘馥馝馡馣骝骡馵馹駃駄駅駆駉駋驽駓驵駗骀驸駜骂骈"
    "駪駬骃駴骎駹駽駾騂騄骓騆騉騋骒骐麟騑騒験騕骛騠騢騣騤騧骧騵驺骟騺蓦骖骠骢驆驈骅驌骁驎骣驒驔驖驙驦驩驫骺鲠骫骭肮骱骴"
    "骶骷髅骾髁髂髄髆膀髇髑髌髋髙髝髞髟髡髣髧髪髫髭髯髲髳髹髺髽髾鬁鬃鬅鬈鬋鬎鬏鬐鬑鬒鬖鬗鬘鬙鬠鬣斗鬫鬬阄鬯鬰鬲鬵鬷魆魈"
    "魊魋魍魉魑魖鳔魛魟魣魦魨魬鲂魵魸鮀鲅鮆鲧鲇鲍鲋鮓鲒鲕鮟鱇鮠鮦鮨鲔鲑鮶鮸鮿鲧鯄鯆鲩鯈鲻鯕鲭鲞鯙鯠鲲鯥鲰鲶鳀鯸鳊鲗䲠鹣"
    "鳇鰋鳄鳆鰕鰛鰜鲥鰤鳏鰦鳎鳐鳁鳓鰶鲦鲡鰼鰽鱀鱄鳙鱆鳕鱎鱐鳝鳝鳜鲟鲎鱠鳣鱨鲚鱮鱲鱵鱻鲅鳦凫鳯鳲鳷鳻鴂鴃鴄鸩鴈鴎鸰鴔鴗鸳"
    "鸯鸲鹆鸱鴠鴢鸪鴥鸸鹋鴳鸻鴷鴽鵀鵁鸺鹁鵖鵙鹈鹕鹅鵟鵩鹌鵫鵵鵷鵻鹍鶂鶊鶏鶒鹙鶗鶡鶤鶦鶬鶱鹟鶵鶸鶹鹡鶿鹚鷁鷃鷄鷇䴘䴘鷊鷏"
    "鹧鷕鹥鸷鷞鷟鸶鹪鹩鷩鷫鷭鹇鹇鸴鷾䴙鸂鸇䴙鸏鸑鸒鸓鸬鹳鸜鹂鹸咸鹾麀麂麃麄麇麋麌麐麑麒麚麛麝麤麸面麫麮麯麰麺麾黁黈黉黢"
    "黒黓黕黙黝黟黥黦黧黮黰黱黪黶黹黻黼黾鼋鼂鼃鼅鼈鼍鼏鼐鼒冬鼖鼙鼚鼛鼡鼩鼱鼪鼫鼯鼷鼽齁齆齇齈齉齌赍齑龀齕齗龅齚龇齞龃龉"
    "龆齢出齧齩齮齯齰齱齵齾厐龑龒龚龖龘龝龡龢龤";
std::string traditional_characters =
    "制咖片型超聲盤鑒定仔點他命書歌粉巾字帳恤手指記憶棒形轉彎溝光○〇㐄㐅㐆㐌㐖毒㐜㐡㐤㐰㐺㑇㑳㒳㒸㔾㗂㗎㝵㞎㞙㞞㠯㢲㢴"
    "㤅㥁㥯㨗㫺㬎㮎㮚㮸㲋㲱㲾㳮㵎㵪㶸㷖㷭㹢㹴犬㺢狓㺵㼝㽮㿝䍃䔢䖟䖸䗈䗥䗪䝓䠶䥯䦉䯝䰾魚䲔䳗䳘䵹鼄䶑一對應映射丁不識下兒"
    "子做二休世丘之貉並中台原則串為甚謂乾淨了百事無成八變五十些人得道雞升天代如併來去個國政策勁幽靈在歐洲遊蕩接樣蘿蔔坑"
    "側化傳價元論醇共再准刀兩斷切分耕耘收穫錢貨物向看舊就緒險刻千金動勞永逸匙零夜半卡通回復返影蹤反常態口咬氣句話同吐快"
    "吹周味呼諾嗚品紅鍋哄而散起唱和問三知生熟團漆黑火糟堆場空塊麵塌糊塗塵染壁廂夔已足多情露水大早到晚夫妻當關萬莫開失古"
    "恨套所料既往孔見提師要家主審寸陰難買鬥牛小撮部陣局展身層巴掌帆風順席地帶過年計於春頭載四季期被蛇怕井繩度願式份彈頃"
    "深前律徑心意念差愁孤行俱全房廳交遮打技長把抓死拿眼淚鼻涕鑰鎖折段抿拍即合掃排掬揮撥擁上入擊洞擲攬改故轍敗文值名斑方"
    "面旁族日秋餐隔雅里終父旦時晌會霎間晃暴寒曝更月望垠際朝夕本正經利杯羹東西板枝獨秀根筋桿進條龍服務概模次函數又性程總"
    "付步腳印趨登毛拔呵氧氮碳決雌雄波未平派謊言流清楚白準溜煙潭有獲聞是處降琴鶴甲病發可拾沙目然瞭直以相眨穿睹瞥瞬矢的解"
    "石鳥神教秉虔誠秘種窩蜂窮竅笑置筆苟勾銷抹殺煞等獎箍節吃箭仇雙鵰詩籌籮筐系列紙級士官統絲毫掛維網盡線微吭響股腦胎脈承"
    "腔臂力致效資源址器舉功投般說講規貿易葉障著慎滿皆輸號木電池衣傾鐘高低視仁覺醒覽遺角銀幣觸潰九鼎蔽抄出駟馬追重語破貧"
    "洗貫走路安蹴至幾蹶振躍役膽汗較輩輪辭贊退六連遍遞邊針血錘音錯門思閃真倒項栽霧類保護川先驚乍體鬨鱗爪鳴滴泡鄰域黨專鼓"
    "作齊炒丑烯亥克內酯冬加奴卯肝炎基尺梁街褲鎬客寵庭巳汝昌烷玲磊糖肇酉醛啷青縣韙良香骨鯛丂七集河市弦喜嘴張舌堵區工業姊"
    "妹星架構巧彩扭歪拼湊餘熱曜武州爺浮屠美鄉老階樹葷素碎落能魄鰓鰻珠丄丅丆万俟丈尚摸母娘量管群亞虎必我堂令申件裝伏位博"
    "俠義界表女墟臺戲臭皮匠勝諸葛亮賽頂倍催請運算包立叉戟離疫苗土史志演圍揭瓦曬夷姑婆帝村寶爛尖杉鹼屜桌山岔島由紀峽壩庫"
    "鎮廢從德後拗湯治旬食明昧曹朋友框欄極權冪曲歸依貓民氟硼氯磷鐵江侗自旅法司洋浦梅園溫暖灣焦班幸用田略番疊皇炮捶硝苯酸"
    "腺苷稜草鏡穗跳遠索錦綱聚氰胺聯店胚膲愛色堇紫羅蘭芝茶飯菱雲蟲藏藩亂叛蘇親債凳學座恐戀柱測肌腹衩錐係貂企烏跪叩軍車農"
    "題迭都甘油屯奏鍵短阿姨陪姐隻顧茅廬槽駕魂鮮鹿頁其菜單乘任供勢午齒漢組織吊調瀉唇坡城報墳外夸將尉建築岸崗公床揚新劍昇"
    "杭林栗校樓標款汽社浣海商館劇院鋼華港機械廣媒環球融第醫科證券綜財樂育游漲猶嶺疏癮瞼確兵領導繳肢膛船艾瑟爾蒼蔡虞傚衫"
    "覆訪訴課諭議軌述野鉤限敵鞋頜頷顎饒首齦站例修凡劃垂屆屬崽頦廚拜挫擺放旋削棋榻檻禮沉注滑營獄畫确儀聘花葬詔員跌轄週達"
    "酒錨閘陷陸雨雪飛威丌于丹久乏予理評產亢卑亦乎舞己悲矩圓詞害誌但住佞佳便俗信票案幅翁倦倫假偏倚斜虧鬼敲停備傷脾胃僅此"
    "像儉匱免宜穴焉戴兼容許凍伯仲負彼晝皂軒輊實刊划顛衛戰哥比省非好黃飾別拘束掩奶睬選擇搖擾煩苦枚寫協厭及格受歡迎約只估"
    "侵犯割狀告或缺抗拒挽撤救藥喻磨滅端倪少逆逾越避靠適吉譽吝玉含延咎歹聽啻淵善謀均勻堪忍夠太惹妙妥妨孕症孝術室完納推冠"
    "積宣疑辯慄碴稱屈撓屑干涉衡待很忙惡忿怎麼怠急恥恭息悅惑惜惟想愉愧怍慌憤啟懂懈懷材才緊招認扣抵拉捨也罷插揣冒搭撞南牆"
    "擴核支攻敢雷攀敬裡嗎需景智暇曾罪遇朽枉止況競爭辱求癒渝溶濟左右袒困補爽特寂寞示弱找謝畏強疾徐痛癢冤符眠睦瞅董何厚云"
    "措活疲羞者輕玻璃祥兆禁移稂莠穩佛換答簡結果盟絕縷途給談否羈翼耐肖脛毋寧興舒若菲萊痕跡窠臼虛衰臉兔撒鷹棺範該詳諱抬泰"
    "讓鬚眉象眾貲賬費灰賴奇慮訓輟辨菽麥辛近送透逞徒速續逮捕遂遑違遜斧鉞艱醉鏽隨觀棄顯飽脂肪使丏丐幫丒且慢末丕替桃宗王尊"
    "涼爵各圖屋脊糧署錄壇吾祿職胄襲君廈丗北壑桐疹損逢陵鷸丙寅戌氨腈唑綸辰酮脫氫酶醚丞丟現掉紗帽弄扯砲碗丠両丣坐存激肩臻"
    "蒂蓮悖序驅丨丩丫挺杈髻鬟細介俄伊犁京尼布訂普渡央委監察檢查劑圈設警隊斯督剩震境航舶革防托播促質版蠑螈鋒研藝歷殘消頻"
    "譜精密製造陲郵候埔堅壓壢凹匯執府究邦俘攝寮彬狼嶽肺腫庸英訊診埋粒胞括控碼韓暑槍樞砥澳哇牟壽甸鑽探篇簽綴縫繼耳肯照婦"
    "埃懸璧軸櫃檯辣擱淺邪跑纖阮陽私囊魔丮丰姿采丱燒丳丵丶丷丸參寨朗桂瑞砂衷霞貌鳳僕艦因嫌宰峰幹絡牌持旨祭禱簿編罰賓辦丼"
    "丿乀乂乃乄仰慕盛曠留考驗闊乆乇么醜麼乊湖燃乑乒乓乕乖僻忤戾离謬迕乗危肥劫除隙浪婿乙炔腸酰吡咯鹽乚乛乜嘢卿玄宮尾狐龜"
    "塔嶷兄弟泉章霄釘耙乞扎哀憐恕討乢乣乤乥乧乨乩童乪乫乭乳暈汁液瑤漿牙癌突竇罩腐膠豬酪蛋糕菌瘤乴乵乶乷乸乹乺乼乾俸冰嘉"
    "噦嚎坤媽屍壘旱枯涸俐渴潮澀煸豆燥爹瘦癟癬瞪袋脆薑貝隆餾乿亀亁叫咕攘扔搞男砸竄蓬麻亃亄亅卻亇遲典今臨繁累卵奉婚聰躬巨"
    "與遷添裂副宿歲怪噁尕崙愣杆硅硫鈦鈾錳芑雜異鈉砷胂磺琥珀艙棍簧胡茬盜浩盆販郎腿亍洪亐互欠助勉惠操斥諉繫戶譯亓墓碑刑鈴"
    "卅渠繽紛斗米旗憲釩燈徽瘟祖拳福穀豐臟腑綁肉醃苓蘊橋鋪霸顏鬧判噴岡底蛙陘礦亖亙亜罕們娜桑那努哈喀弗烈曼松森杜氏盃奧琛"
    "敦戊穆聖裔彙薛孫亟亡佚虜羊牢奮釋卷卸契媾感額睫纏誼趾塞擠紐阻還配馳莊亨洛祚亪享津滬畿郊慈菴枇杷膏亭閣鋥麗亳亶亹誅初"
    "責翻瘋偶傑叢稠妖拖寰居吸授慧蝸吞壯魅狗矛盾益渣患憂稀描猿夢暫涯畜禍緣沸搜引擎臣橫紜誰混援蒸獸獅稅剖亻亼亽亾什獻剎邡"
    "麽仂仃仄仆富怨仈仉畢昔晨殼紹仍仏仒仕宦仗欺恃腰嘆歎炬梓訖施仙后瓊逝仚仝仞仟悔仡佬償填泊拓撲簇羔購頓欽佩髮棻閫馭養億"
    "儆尤藉幀賑凌敘帖李柔剛沃眥睚戒訛取饗讀仨仫仮著泳臥躺韶夏裁仳仵唯賢憑釣誕仿似宋彿諷伀碩盼鵝伄儅伈伉儷柯始娃邁戈坦堡"
    "帕茨薩廟瑪莉莎藤霍姆伋伍奢胥廷芳豪伎倆侍汛勒希羲雛伐憩整謨閑閒伕伙伴頤伜伝伢叔恆茲恩翰伱伲侶伶俜悧鼬伸懶縮喇叭伹伺"
    "伻伽倻輻伾佀佃佇佈喬妮墨佉盧佌貸劣廉昂檔濃矮傘窪緩耗胸谷迷擋率齲宅沫舍療佐貳佑佔優據鏵嘗呢須魯曉佗佘余坪寺瓜銃僧蒙"
    "芒陀龕哼嘔坊姦孽弊揖祟繭縛誓賊佝僂瞀佟你奪趕佡佢佣佤佧賈佪佫佯佰佱潔績釀餚佴捲佶佷佸佹佺佻佼佽佾具喚窘壞娛怒慨硬習"
    "慣聾膨脹蔓駭貴痺侀侁侂侃侄侅鴻燕侇侈糜靡侉侌妾侏儒倉鼠侐侑侔侖侘侚鏈侜偎傍鈷循柳葫蘆附価侮罵蔑侯岩截蝕侷貼壺嬛宴捷"
    "攜桶箋酌俁狹膝狄俅俉俊俏俎俑俓俔諺俚俛黎健呈固墒增守康箱濕祐鏢鑣槓盒靖膜齡俞豹獵噪孚封札筒託衍鴿剪撰稿煉廠禊練繕葺"
    "俯瞰撐衝俲俳俴俵俶俷俺俻俾倀倂倅儲卒惶敷猝逃頡蓄崇隱倌倏忽刺蠟燭噍嚼坍扁抽斃蔥楣灌灶糞背藪賣賠閉霉騰倓倔倖倘倜儻倝"
    "借箸挹澆閱倡狂倢倣値倥傯倨傲倩匡嗣沖柝珍倬倭寇猩倮倶倷倹勤讚偁偃充偽吏嗓寐惺扮拱芫茜藉虢鈔偈偉晶偌宕距析濾殿疼癱註"
    "頗偓偕鴨歇滯偝偟偢忘怡旺偨偩偪偫偭偯偰偱偲偵緝蹄偷減惰漏窺竊偸偺迹傀儡傅傈僳傌籬傎奎琳迪叟芭傒傔傕傖悉荒傜傞傢傣芽"
    "逼傭婢傮睨寄檄誦謠頌傴擔辜弓慘蒿悼疤傺傻屄臆巢洩篋羨蓋軋頹傿儸僄僇僉僊働僎僑僔僖僚僝僞僣僤僥僦猴僨僩僬僭僮僯僰僱僵"
    "殖籤靜僾僿征隴儁儂儃儇儈朴薄儊儋儌儍儐儓儔儕儗儘儜儞儤儦儩汰哉寡渥裕酷儭儱罐儳儵儹儺儼儽兀臬臲鷲允勛勳宙宵帥憝彞諧"
    "嫂鬩暢沛溢盈飢赫兇悍狠猛頑愚妣斬秦遣鞭耀敏榮槃澤爆碟磁禿纜輝霽鹵朵婁孜烽醬勃汀箕裘鉗耶懞蕾徹兌軟遭黜兎児韻媳爸兕觥"
    "兗兙兛兜售鍪肚兝兞兟兡兢兣樽殮涅睡稟籍贅泌啡肽奸幕涵澇熵疚眷稃襯訌赴煥椒殲植跏沒試誤猜棲窗肋袖頰兪卦撇鬍岐廓轎疸楓"
    "茴瓏廁秩募勺噸寓斤曆畝迫筷釐最淫螺韜兮寬匪篩襄贏軛複兲詐刃堰戎痞蟻餉它冀鑄冂冃円冇冉冊嫁厲礪竭醮冏牧冑冓冔冕冖冗冘"
    "冞冢窄抑誣冥冫烘菇蟄冷凝坨橇淇淋炭餅磚磧窖醋雕雹霜冱冶爐艷嘲峻灘淡漠煖颼飲冼冽凃凄愴梗凅凇凈凊凋敝濛凔凜遵汞脢凞几"
    "凢処凰凱凵凶焰凸摺刷紋預喪嘍奔巡榜殯芙蓉租籠輯鞘萃凼鋸鑊刁蠻刂娩崩批拆攤掰櫱驟歧顆秒袂贓勿囑忌磋琢膚刈羽刎訟戮舂槳"
    "艇刓刖霹靂刜創犢刡恙墅幟筵緻刦刧刨昏默攸尿慾薰潤薰圭刪刮痧鏟刱刲刳刴刵踏磅戳柏槐繡芹莧蝟舟銘鵠鶩刼剁剃辮剄剉履鉛剋"
    "剌姻咽哨廊掠桅沿召瞻翅趙卜渺茫郭剒剔剕瀝剚愎毅訥纔剜剝啄採剞剟剡剣剤綵剮腎駛黏剰袍剴紊剷剸剺剽剿劁劂劄劈啪柴扳啦劉"
    "奭姥夼昫涓熙禪禹錫翔雁鶚劊劌弩柄蜻蛉劒劓劖劘劙瀾簣賞磯釜晉甜薪逐劦熔紂虐赤囚劬劭労劵効劻劼劾峭艮勅勇勵勍勐臘脖龐漫"
    "飼盪粥輒勖勗勘驕餒碌泮雇捐竹騎殊阱勣樸懇謹勦勧勩勯勰勱勲勷勸懲慰誡諫勹芡踐闌匁庇拯粟紮袱裹餃匆遽匈匉匊匋匍匐莖匏匕"
    "妝痰膿蛹齋苑烤蹈塘羌熊閥螳螂疆碚竿緯荷茵邙魏匚匜匝匟扶稷匣匭攏匸匹耦匽匾匿卂叮瘡禧軫堤棚迢鈞鍊卄卆遐卉瓷盲瓶噹胱腱"
    "裸卋卌卍卐怯污賤鄙齷齪陋卓溪唐梯漁陳棗泥漳潯澗梨芬譙贍轅迦鄭単驢弈洽鰲卛占筮卝卞卟吩啉屎翠厄卣卨卪卬卮榫襖璽綬鈕蚤"
    "懼殆篤聳卲帘帙繞卹卼卽厂厎厓厔厖厗奚厘厙厜厝諒厠厤厥厪膩孢厮厰厳厴厹厺粕垢蕪菁厼厾叁悟茸薯叄吵笄悌哺譏坫壟弧芯杠潛"
    "嬰芻袁詰貪諜煽饋駁収岳締災賄騙叚叡吻攔蘑蜜訣燧玩硯箏椎藺銅逗驪另覓叨嘮謁杵姓喊嚷囂咚嚀塑尋惱憎擦祇泣滲蝠叱吒咄咤喝"
    "籀黛舵舷叵叶鐸懿昭穰苴遼叻叼吁塹嫖賭瞧爬衆抒吅吆夥巹橡滌抱縱摩郡唁墜扇籃膀襪頸吋愾諮酬哭妓媛暗錶韁邇妃羿絮蕃渾拐葵"
    "暮隅吔吖啶嗪戚吜嗇噬嚥吟哦詠吠吧唧嗒咐吪雋咀徵燐苞茹鈣哧吮吰吱嘎吲哚吳棟嬌窟孟簫忠晗淞闔閭趼宇吶睛噓拂捧疵熄竽笛糠"
    "吼吽呀呂韋矇呃呆笨呇貢呉罄呋喃呎呏呔呠呡癡呣呤呦呧瑛眩扒晬淑姬瑜璇鵑呪呫嗶嚅囁呬呯呰呱呲咧噌鈍呴呶呷呸呺呻哱咻嘯嚕"
    "籲坎坷邏呿咁咂咆哮咇咈咋蟹煦珅藹咍咑咒詛咔噠嚓咾噥哩喱咗咠咡咢咣咥咦咨嗟詢咩咪咫嚙齧咭咮咱咲咳嗆嗽咴咷咸咹咺咼喉咿"
    "婉慟憫賦矜綠茗藍哂搶瞞哆嗦囉噻啾濱彗哋哌哎唷喲哏哐哞哢哤哪裏哫啼喘哰哲萎蚌哳哶哽哿唄唅唆唈唉唎唏嘩堯棣殤璜睿肅唔睇"
    "唕唚唞唣喳唪唬唰喏唲唳唵嘛唶唸唹唻唼唾唿啁啃鸚鵡啅埠棧榷祺舖鞅飆啊啍啎啐啓啕啖啗啜啞祈啢啣啤啥啫啱啲啵啺饑啽噶崑沁"
    "喁喂喆裙喈嚨喋喌喎喑喒喓喔粗喙幛慶滋鵲喟喣喤喥喦喧騷喨喩梆喫葡萄喭駝挑嚇碰樅瓣純皰藻趟鉻喵営喹喺喼喿嗀嗃嗄嗅嗈嗉嗊"
    "嗍嗐嗑嗔詬嗕嗖嗙嗛嗜痂癖嗝嗡嗤嗥嗨嗩嗬嗯嗰嗲嗵嘰嗷嗹嗾嗿嘀嘁嘂嘅惋嘈峪禾蔭嘊嘌嘏嘐嘒嘓嘖嘚嘜嘞嘟囔嘣嘥嘦嘧嘬嘭這謔"
    "嚴敞饞鬆嘵嘶嘷嘸蝦嘹嘻嘽嘿噀噂噅噇噉噎噏噔噗噘噙噚噝噞噢噤蟬皿噩噫噭噯噱噲噳嚏涌灑欲巫霏噷噼嚃嚄嚆抖嚌嚐嚔囌嚚嚜嚞"
    "嚟嚦嚬嚭嚮嚯嚲嚳飭按竣苛嚵嚶囀囅囈膪謙囍囒囓囗囘蕭酚飄濺諦囝溯眸紇鑾鶻囟殉囡団囤囥囧囨囪囫圇囬囮囯囲図囶囷囸囹圄圉"
    "擬囻囿圀圂圃圊粹蠹赦圌墾圏滾鯡鑿枘圕圛圜圞坯埂壤骸炕祠窯豚紳魠鯪鱉圧握圩圪垯圬圮圯炸岬幔毯祇窨菩溉圳圴圻圾坂坆沾坋"
    "坌舛壈昆墊墩椅坒坓坩堝坭坰坱坳坴坵坻坼楊掙涎簾垃垈垌垍垓垔垕垗垚垛垝垣垞垟垤垧垮垵垺垾垿埀畔埄埆埇埈埌殃隍埏埒埕埗"
    "埜埡埤埦埧埭埯埰埲埳埴埵埶紼埸培怖樁礎輔埼埽堀訶姪廡堃堄摧磐貞韌砌堈堉堊堋堌堍堎堖堙堞堠礁堧堨輿堭堮蜓摘堲堳堽堿塁"
    "塄塈煤塋棵塍塏塒塓綢塕鴉沽虱塙塚塝繆塡塢塤塥塩塬塱塲蟎塼塽塾塿墀墁墈墉墐夯増毀墝墠墦漬缽墫墬墮墰墺墻櫥壅壆壊壌壎壒"
    "榨蒜壔壕壖壙壚壜壝壠壡壬壭壱売壴壹壻壼寢壿夂夅夆変夊夌漱邑夓腕泄甥禦骼夗夘夙袞瑙妊娠醣梟珊鶯鷺戧幻魘夤蹀祕擂鶇姚宛"
    "閨嶼庾撻拇賛蛤裨菠氅漓撈湄蚊霆鯊箐篆篷荊肆舅荔鮃巷慚骰辟邱鎔鐮阪漂燴鯢鰈鱷鴇臚鵬妒峨譚枰晏璣癸祝秤竺牡籟恢罡螻蠍賜"
    "絨御梭夬夭砣榆怙枕夶夾餡奄崛葩譎奈賀祀贈奌奐奓奕訢詝奘奜奠奡奣陶奨奩魁奫奬奰媧孩貶隸酥宄狡猾她奼嫣妁氈荼皋膻蠅嬪妄"
    "妍嫉媚嬈妗趣妚妞妤礙妬婭妯娌妲妳妵妺姁姅姉姍姒姘姙姜姝姞姣姤姧姫姮娥姱姸姺姽婀娀誘懾脅娉婷娑娓娟娣娭娯娵娶娸娼婊婐"
    "婕婞婤婥谿孺婧婪婬婹婺婼婽媁媄媊媕媞媟媠媢媬媮媯媲媵媸媺媻媼眯媿嫄嫈嫋嫏嫕嫗嫘嫚嫜嫠嫡嫦嫩嫪毐嫫嫬嫰嫵嫺嫻嫽嫿嬀嬃"
    "嬅嬉耍嬋痴豔嬔嬖嬗嬙嬝嬡嬢嬤嬦嬬嬭幼嬲嬴嬸嬹嬾嬿孀孃孅孌孏曰癲屏孑孓雀孖斟簍謎摺孛矻鳩崮軻祜鸞孥邈毓棠臏孬孭孰孱孳"
    "孵泛罔銜孻孿宀宁宂拙株薇掣撫琪瓿榴謐彌宊濂祁瑕宍宏碁宓邸讞実潢町宥宧宨宬徵崎駿掖闕臊煮禽蠶宸豫寀寁寥寃簷庶寎暄磣寔"
    "寖寘寙寛寠苫寤肘洱濫蒗陝覈寪弘綽螽寳擅疙瘩晷対檐専尃尅贖絀繚疇釁尌峙醌襟痲碧屁昊槌淘恵瀑牝畑莓缸羚覷蔻髒躁尒尓銳尗"
    "尙尜尟尢尥尨尪尬尭尰擒尲尶尷尸尹潽蠖蛾尻釦梢蚴鰭脬蹲屇屌蚵屐屓挪屖屘屙屛屝屢屣巒嶂巖舄屧屨屩屪屭屮戍駐鉀崖嵛巔旮旯"
    "楂欖櫸芋茱萸靛麓屴屹屺屼岀岊岌岍阜岑彭鞏岒岝岢嵐岣岧岨岫岱岵岷峁峇峋峒峓峞峠嵋峩峯峱峴峹峿崀崁崆禎崋崌崍嶇崐崒崔嵬"
    "巍螢顥崚崞崟崠崢巆崤崦崧殂崬崱崳崴崶崿嵂嵇嵊泗嵌嵎嵒嵓嵗嵙嵞嵡嵩嵫嵯嵴嵼嵾嶁嶃嶄晴嶋嶌嶒嶓嶔嶗嶙嶝嶞嶠嶡嶢嶧嶨嶭嶮"
    "嶰嶲嶴嶸巂巃巇巉巋巌巓巘巛滇芎巟巠弋迴巣巤炊擘蜥蟒蠱覡巰蜀彥淖杏茂甫楞巻巽幗巿帛斐鯽蕊帑帔帗帚琉汶帟帡帣帨帬帯帰帷"
    "帹暆幃幄幇幋幌幏幘幙幚幞幠幡幢幦幨幩幪幬幭幯幰遙蹉跎餘庚鑑幵幷稚邃庀庁広庄庈庉笠庋跋庖犧庠庤庥鯨庬庱庳庴庵馨衢庹庿"
    "廃廄廆廋廌廎廏廐廑廒廕廖廛廝搏鑼廞弛袤廥廧廨廩廱綿踵髓廸廹甌鄴廻廼廾廿躔弁皺弇弌弍弎弐弒弔詭憾薦弝弢弣弤弨弭弮弰弳"
    "霖繇燾斌旭溥騫弶弸弼弾彀彄彆纍糾彊彔彖彘彟彠陌彤貽彧繪虹彪炳彫蔚鷗彰癉彲彳彴彷彷徉徨彸彽踩斂旆徂徇徊渭畬鉉裼従筌徘"
    "徙徜徠膳甦萌漸徬徭醺徯徳徴潘徻徼忀瘁胖燎怦悸顫扉犀澎湃砰恍惚絞隘忉憚挨餓忐忑忒忖応忝忞耿忡忪忭忮忱忸怩忻悠懣怏遏怔"
    "怗怚怛怞懟黍訝怫怭懦怱怲怳怵惕怸怹恁恂恇恉恌恏恒恓恔恘恚恛恝恞恟恠恣恧眄恪恫恬澹恰恿悀悁悃悄悆悊悐悒晦悚悛悜悝悤您"
    "悩悪悮悰悱悽惻悳悴悵惘悶悻悾惄愫鍾蒐惆惇惌惎惏惓惔惙惛耄惝瘧濁惥惦惪惲惴惷惸拈愀愃愆愈愊愍愐愑愒愓愔愕愙氓蠢騃昵愜"
    "赧愨愬愮愯愷愼慁慂慅慆慇靄慉慊慍慝慥慪慫慬慱慳慴慵慷慼焚憀灼鬱憃憊憋憍眺捏軾憒憔憖憙憧憬憨憪憭憮憯憷憸憹憺懃懅懆邀"
    "懊懋懌懍懐懞懠懤懥懨懫懮懰懱毖懵遁樑雍懺懽戁戄戇戉戔戕戛戝戞戠戡戢戣戤戥戦戩戭戯轟戱披菊牖戸戹戺戻戼戽鍬扂楔扃扆扈"
    "扊杖牽絹銬鐲賚扐摟攪烊盹瞌跟躉鑔靶鼾払扗玫腮扛扞扠扡扢盔押扤扦扱罾揄綏鞍郤窾扻扼扽抃抆抈抉抌抏瞎抔繯縊擻抜抝択抨摔"
    "歉躥牾抶抻搐泵菸拃拄拊髀拋拌脯拎拏拑擢秧沓曳攣迂拚拝拠拡拫拭拮踢拴拶拷攢拽掇芥橐簪摹疔挈瓢驥捺蹻挌挍挎挐揀挓挖掘浚"
    "挙揍聵挲挶挾挿捂捃捄捅捆捉捋胳膊揎捌捍捎軀蛛捗捘捙捜捥捩捫捭据捱捻捼捽掀掂掄臀膘掊掎掏掐笙掔掗掞棉芍掤搪闡掫掮掯揉"
    "掱掲掽掾揃揅揆搓揌諢揕揗揘揜揝揞揠揥揩揪揫櫫遒麈揰揲揵揶揸揹揺搆搉搊搋搌搎搔搕撼櫓搗搘搠搡搢搣搤搥搦搧搨搬楦褳訕赸"
    "搯搰搲搳搴搵搷搽搾搿摀摁摂摃摎摑摒摓跤摙摛摜摞摠摦睺羯摭摮摯摰摲摳摴摶摷摻摽撂撃撅稻撊撋撏鐧潑撕撙撚撝撟撢撣撦撧撩"
    "撬撱朔撳蚍蜉撾撿擀擄闖擉缶觚擐擕擖擗擡擣擤澡腚擧擨擩擫擭擯擰擷擸擼擽擿攃攄攆攉攥攐攓攖攙攛每攩攫轡澄攮攰攲攴軼攷砭"
    "訐攽碘敁敃敇敉敍敎筏敔敕敖閏誨敜煌敧敪敱敹敺敻敿斁衽斄牒縐謅斉斎斕鶉讕駮鱧斒筲斛斝斞斠斡斢斨斫斮晾沂潟穎絳邵斲斸釳"
    "於琅斾斿旀旂旃旄渦旌旎旐旒旓旖旛旝旟旡旣浴旰獺魃旴旹旻旼旽昀昃昄昇昉晰躲澈熹皎皓礬昑昕昜昝昞昡昤暉筍昦昨昰昱昳昴昶"
    "昺昻晁蹇隧蔬髦晄晅晒晛晜晞晟晡晢晤晥曦晩萘瑩顗晿暁暋暌暍暐暔暕煅暘暝暠暡曚暦暨暪朦朧暱暲殄馮暵暸暹暻暾曀曄曇曈曌曏"
    "曐曖曘曙曛曡曨曩駱曱甴肱曷牘禺錕曽滄耽朁朅朆杪栓誇竟粘絛朊膺朏朐朓朕朘朙瞄覲溘饔飧朠朢朣柵椆澱蝨朩朮朰朱炆璋鈺熾鹮"
    "朳槿朶朾朿杅杇杌隉欣釗湛漼楷瀍煜玟纓翱肈舜贄适逵杓杕杗杙荀蘅杝杞脩珓筊杰榔狍閦顰緬莞杲杳眇杴杶杸杻杼枋枌枒枓衾葄翹"
    "紓逋枙狸椏枟槁枲枳枴枵枷枸櫞枹枻柁柂柃柅柈柊柎某柑橘柒柘柙柚柜柞櫟柟柢柣柤柩柬柮柰柲橙柶柷柸柺査柿栃栄栒栔栘栝栟栢"
    "栩栫栭栱栲栳栴檀栵栻桀驁桁鎂桄桉桋桎梏椹葚桓桔桕桜桟桫欏桭桮桯桲桴桷桹湘溟梃梊梍梐潼梔梘梜梠梡梣梧梩梱梲梳梴梵梹棁"
    "棃櫻棐棑棕櫚簑繃蓑棖棘棜棨棩棪棫棬棯棰棱棳棸棹槨棼椀椄苕椈椊椋椌椐椑椓椗検椤椪椰椳椴椵椷椸椽椿楀楄楅篪楋楍楎楗楘楙"
    "楛楝楟楠楢楥楨楩楪楫楬楮楯楰楳楸楹楻楽榀榃榊榎槺榕榖榘榛狉莽榜笞榠榡榤榥榦榧榪榭榰榱槤霰榼榾榿槊閂槎槑槔槖様槜槢槥"
    "槧槪槭槮槱槲槻槼槾樆樊樏樑樕樗樘樛樟樠樧樨権樲樴樵猢猻樺樻罍樾樿橁橄橆橈笥龠橕橚橛輛橢橤橧豎膈跨橾橿檁檃檇檉檍檎檑"
    "檖檗檜檟檠檣檨檫檬檮檳檴檵檸櫂櫆櫌櫛櫜櫝櫡櫧櫨櫪櫬櫳櫹櫺茄櫽欀欂欃欐欑欒欙欞溴欨欬欱欵欶欷歔欸欹欻欼欿歁歃歆艎歈歊"
    "蒔蝶歓歕歘歙歛歜歟歠蹦詮鑲蹣跚陞陟歩歮歯歰歳歴璞歺瞑歾歿殀殈殍殑殗殜殙殛殞殢殣殥殪殫殭殰殳荃殷殸殹蛟殻殽謗毆毈毉餵"
    "毎毑蕈毗毘毚茛鄧毧毬毳毷毹毽毾毿氂氄氆靴氉氊氌氍氐聊氕氖気氘氙氚氛氜氝氡洶焊痙氤氳氥氦鋁鋅氪烴氬銨痤汪滸漉痘盂碾菖"
    "蒲蕹蛭螅氵氷氹氺氽燙氾氿渚汆汊汋汍汎汏汐汔汕褟汙汚汜蘺沼穢衊汧汨汩汭汲汳汴隄汾沄沅沆瀣沇沈葆浸淪湎溺痼痾沌沍沏沐沔"
    "沕沘浜畹礫沚沢沬沭沮沰沱灢沴沷籽沺烹濡洄泂肛泅泆湧肓泐泑泒泓泔泖泙泚泜泝泠漩饃濤粼濘蘚鰍泩泫泭泯銖泱泲洇洊涇琵琶荽"
    "薊箔洌洎洏洑潄濯洙洚洟洢洣洧洨洩痢滔洫洮洳洴洵洸洹洺洼洿淌蜚浄浉浙贛渫浠浡浤浥淼瀚浬浭翩萍浯浰蜃淀苔蛞蝓蜇螵蛸煲鯉"
    "浹浼浽溦涂涊涐涑涒涔滂涖涘涙涪涫涬涮涴涶涷涿淄淅淆淊淒黯淓淙漣淜淝淟淠淢淤淥淦淩猥藿褻淬淮淯淰淳詣淶紡淸淹燉癯綺渇"
    "済渉渋渓渕渙渟渢滓渤澥渧渨渮渰渲渶渼湅湉湋湍湑湓湔黔湜湝湞湟湢湣湩湫湮麟湱湲湴湼満溈溍溎溏溛舐漭溠溤溧馴溮溱溲溳溵"
    "溷溻溼溽溾滁滃滉滊滎滏稽滕滘滙滝滫滮羼耷滷滹滻煎漈漊漎繹漕漖漘漙漚漜漪漾漥漦漯漰漵漶漷濞潀潁潎潏潕潗潚潝潞潠潦祉瘍"
    "潲潵潷潸潺潾潿澁澂澃澉澌澍澐澒澔澙澠澣澦澧澨澫澬澮澰澴澶澼熏郁濆濇濈濉濊貊濔疣濜濠濩觴濬濮盥濰濲濼瀁瀅瀆瀋瀌瀏瀒瀔"
    "瀕瀘瀛瀟瀠瀡瀦瀧瀨瀬瀰瀲瀳瀵瀹瀺瀼灃灄灉灋灒灕灖灝灞灠灤灥灨灩灪蜴灮燼獴灴灸灺炁炅魷炗炘炙炤炫疽烙釺炯炰炱炲炴炷燬"
    "炻烀烋瘴鯧烓烔焙烜烝烳飪烺焃焄耆焌焐焓焗焜焞焠焢焮焯焱焼煁煃煆煇煊熠煍熬煐煒煕煗燻礆霾煚煝煟煠煢矸煨瑣煬萁煳煺煻熀"
    "熅熇熉羆熒穹熗熘熛熜稔諳爍熤熨熯熰眶螞熲熳熸熿燀燁燂燄盞燊燋燏燔隼燖燜燠燡燦燨燮燹燻燽燿爇爊爓爚爝爟爨蟾爯爰爲爻爿"
    "爿牀牁牂牄牋牎牏牓牕釉牚腩蒡虻牠雖蠣牣牤牮牯牲牳牴牷牸牼絆牿靬犂犄犆犇犉犍犎犒犖犗犛犟犠犨犩犪犮犰狳犴犵犺狁甩狃狆"
    "狎狒獾狘狙黠狨狩狫狴狷狺狻豕狽蜘猁猇猈猊猋猓猖獗猗猘猙獰獁猞猟獕猭猱猲猳猷猸猹猺玃獀獃獉獍獏獐獒獘獙獚獜獝獞獠獢獣"
    "獧鼇蹊獪獫獬豸獮獯鬻獳獷獼玀玁菟玅玆玈珉糝禛郅玍玎玓瓅玔玕玖玗玘玞玠玡玢玤玥玦玨瑰玭玳瑁玶玷玹玼珂珇珈瑚珌饈饌珔珖"
    "珙珛珞珡珣珥珧珩珪珮珶珷珺珽琀琁隕琊琇琖琚琠琤琦琨琫琬琭琮琯琰琱琲瑯琹琺琿瑀瑂瑄瑉瑋瑑瑔瑗瑢瑭瑱瑲瑳瑽瑾瑿璀璨璁璅"
    "璆璈璉璊璐璘璚璝璟璠璡璥璦璩璪璫璯璲璵璸璺璿瓀瓔瓖瓘瓚瓛臍瓞瓠瓤瓧瓩瓮瓰瓱瓴瓸瓻瓼甀甁甃甄甇甋甍甎甏甑甒甓甔甕甖甗"
    "飴蔗甙詫鉅粱盎銹糰甡褥産甪甬甭甮甯鎧甹甽甾甿畀畁畇畈畊畋畎畓畚畛畟鄂畤畦畧荻畯畳畵畷畸畽畾疃疉疋疍疎簞疐疒疕疘疝疢"
    "疥疧疳疶疿痁痄痊痌痍痏痐痒痔痗瘢痚痠痡痣痦痩痭痯痱痳痵痻痿瘀瘂瘃瘈瘉瘊瘌瘏瘐瘓瘕瘖瘙瘚瘛瘲瘜瘝瘞瘠瘥瘨瘭瘮瘯瘰癧瘳"
    "癘瘵瘸瘺瘻瘼癃癆癇癈癎癐癔癙癜癠癤癥癩蟆癪癭癰発踔紺蔫酵皙砬砒翎翳蘞鎢鑞皚鵯駒鱀粵褶皀皁莢皃鎛皈皌皐皒硃皕皖皘皜皝"
    "皞皤皦皨皪皫皭糙綻皴皸皻皽盅盋盌盍盚盝踞盦盩鞦韆盬盭眦睜瞤盯盱眙裰盵盻睞眂眅眈眊県眑眕眚眛眞眢眣眭眳眴眵眹瞓眽郛睃"
    "睅睆睊睍睎睏睒睖睙睟睠睢睥睪睪睯睽睾瞇瞈瞋瞍逛瞏瞕瞖瞘瞜瞟瞠瞢瞫瞭瞳瞵瞷瞹瞽闍瞿矓矉矍鑠矔矗矙矚矞矟矠矣矧矬矯矰矱"
    "硪碇磙罅舫阡、矼矽礓砃砅砆砉砍砑砕砝砟砠砢砦砧砩砫砮砳艏砵砹砼硇硌硍硎硏硐硒硜硤硨磲茚鋇硭硻硾碃碉碏碣碓碔碞碡碪碫"
    "碬碭碯碲碸碻礡磈磉磎磑磔磕磖磛磟磠磡磤磥蹭磪磬磴磵磹磻磽礀礄礅礌礐礚礜礞礤礧礮礱礲礵礽礿祂祄祅祆禳祊祍祏祓祔祕祗祘"
    "祛祧祫祲祻祼餌臠錮禂禇禋禑禔禕隋禖禘禚禜禝禠禡禢禤禥禨禫禰禴禸稈秈秊闈颯秌秏秕笈蘵賃秠秣秪秫秬秭秷秸稊稌稍稑稗稙稛"
    "稞稬稭稲稹稼顙稾穂穄穇穈穉穋穌貯穏穜穟穠穡穣穤穧穨穭穮穵穸窿闃窀窂窅窆窈窕窊窋窌窒窓窔窞窣窬黷蹙窰窳窴窵窶窸窻竁竃"
    "竈竑竜竝竦竪篦篾笆鮫竾笉笊笎笏笐靨笓笤籙笪笫笭笮笰笱笲笳笵笸笻筀筅筇筈筎筑筘筠筤筥筦筧筩筭筯筰筱筳筴讌筸箂箇箊箎箑"
    "箒箘箙箛箜篌箝箠箬鏃箯箴箾篁篔簹篘篙篚篛篜篝篟篠篡篢篥篧篨篭篰篲篳篴篶篹篼簀簁簃簆簉簋簌簏簜簟簠簥簦簨簬簰簸簻籊籐"
    "籒籓籔籖籚籛籜籣籥籧籩籪籫籯芾麴籵籸籹籼粁粃粋粑粔糲粛粞粢粧粨粲粳粺粻粽闢粿糅糆糈糌糍糒糔萼糗蛆蹋糢糨糬糭糯糱糴糶"
    "糸糺紃蹼鰹黴紆紈絝紉閩襻紑紕紘錠鳶鷂紝紞紟紥紩紬紱紲紵紽紾紿絁絃絅経絍絎絏縭褵絓絖絘絜絢絣螯絪絫聒絰絵絶絺絻絿綀綃"
    "綅綆綈綉綌綍綎綑綖綘継続緞綣綦綪綫綮綯綰罟蝽綷縩綹綾緁緄緅緆緇緋緌緎総緑緔緖緗緘緙緜緡緤緥緦纂緪緰緱緲緶緹縁縃縄縈"
    "縉縋縏縑縕縗縚縝縞縟縠縡縢縦縧縯縰騁縲縳縴縵縶縹縻衙縿繄繅繈繊繋繐繒繖繘繙繠繢繣繨繮繰繸繻繾纁纆纇纈纉纊纑纕纘纙纚"
    "纛缾罃罆罈罋罌罎罏罖罘罛罝罠罣罥罦罨罫罭鍰罳罶罹罻罽罿羂羃羇羋蕉５１鴕羑羖羗羜羝羢羣羥羧羭羮羰羱羵羶羸藜鮐翀翃翄翊"
    "翌翏翕翛翟翡翣翥翦躚翪翫翬翮翯翺翽翾翿闆饕鴰鍁耋耇耎耏耑耒耜耔耞耡耤耨耩耪耬耰鬢耵聹聃聆聎聝聡聦聱聴聶聼閾聿肄肏肐"
    "肕腋肙肜肟肧胛肫肬肭肰肴肵肸肼胊胍胏胑胔胗胙胝胠銓胤胦胩胬胭胯胰胲胴胹胻胼胾脇脘脝脞脡脣脤脥脧脰脲脳腆腊腌臢腍腒腓"
    "腖腜腠腡腥腧腬腯踝蹬鐐腴腶蠕誹膂膃膆膇膋膔膕膗膙膟黐膣膦膫膰膴膵膷膾臃臄臇臈臌臐臑臓臕臖臙臛臝臞臧蓐詡臽臾臿舀舁鰟"
    "鮍舋舎舔舗舘舝舠舡舢舨舭舲舳舴舸舺艁艄艅艉艋艑艕艖艗艘艚艜艟艣艤艨艩艫艬艭荏艴艶艸艹艻艿芃芄芊萰陂藭芏芔芘芚蕙芟芣"
    "芤茉芧芨芩芪芮芰鰱芴芷芸蕘豢芼芿苄苒苘苙苜蓿苠苡苣蕒苤苧苪鎊苶苹苺苻苾茀茁范蠡萣茆茇茈茌茍茖茞茠茢茥茦菰茭茯茳藨茷"
    "藘茼荁荄荅荇荈菅蜢鴞荍荑荘荳荵荸薺莆莒莔莕莘莙莚莛莜莝莦莨菪莩莪莭莰莿菀菆菉菎菏菐菑菓菔菕菘菝菡菢菣菥蓂菧菫轂鎣菶"
    "菷菹醢菺菻菼菾萅萆萇萋萏萐萑萜萩萱萴萵萹萻葇葍葎葑葒葖葙葠葥葦葧葭葯葳葴葶葸葹葽蒄蒎蒓蘢薹蒞蒟蒻蒢蒦蒨蒭藁蒯蒱鉾蒴"
    "蒹蒺蒽蓀蓁蓆蓇蓊蓌蓍蓏蓓蓖蓧蓪蓫蓽跣藕蓯蓰蓱蓴蓷蓺蓼蔀蔂蔃蔆蔇蔉蔊蔋蔌蔎蔕蔘蔙蔞蔟鍔蔣雯蔦蔯蔳蔴蔵蔸蔾蕁蕆蕋蕍蕎蕐"
    "蕑蕓蕕蕖蕗蕝蕞蕠蕡蕢蕣蕤蕨蕳蕷蕸蕺蕻薀薁薃薅薆薈薉薌薏薐薔薖薘薙諤釵薜薠薢薤薧薨薫薬薳薶薷薸薽薾薿藄藇藋藎藐藙藚藟"
    "藦藳藴藶藷藾蘀蘁蘄蘋蘗蘘蘝蘤蘧蘩蘸蘼虀虆虍蟠虒虓虖虡虣虥虩虯虰蛵虵虷鱒虺虼蚆蚈蚋蚓蚔蚖蚘蚜蚡蚣蚧蚨蚩蚪蚯蚰蜒蚱蚳蚶"
    "蚹蚺蚻蚿蛀蛁蛄蛅蝮蛌蛍蛐蟮蛑蛓蛔蛘蛚蛜蛡蛣蜊蛩蛺蛻螫蜅蜆蜈蝣蜋蜍蜎蜑蠊蜛餞蜞蜣蜨蜩蜮蜱蜷蜺蜾蜿蝀蝃蝋蝌蝍蝎蝏蝗蝘蝙"
    "蝝鱝蝡蝤蝥蝯蝰蝱蝲蝴蝻螃蠏螄螉螋螒螓螗螘螙螚蟥螟螣螥螬螭螮螾螿蟀蟅蟈蟊蟋蟑蟓蟛蟜蟟蟢蟣蟨蟪蟭蟯蟳蟶蟷蟺蟿蠁蠂蠃蠆蠋"
    "蠐蠓蠔蠗蠙蠚蠛蠜蠧蠨蠩蠭蠮蠰蠲蠵蠸蠼蠽衁衂衄衇衈衉衋衎衒衕衖衚衞裳鈎衭衲衵衹衺衿袈裟袗袚袟袢袪袮袲袴袷袺袼褙袽裀裉"
    "裊裋裌裍裎裒裛裯裱裲裴裾褀褂褉褊褌褎褐褒褓褔褕褘褚褡褢褦褧褪褫褭褯褰褱襠褸褽褾襁襃襆襇襉襋襌襏襚襛襜襝襞襡襢襤襦襫"
    "襬襭襮襴襶襼襽襾覂覃覅覇覉覊覌覗覘覚覜覥覦覧覩覬覯覰観覿觔觕觖觜觽觝觡酲觩觫觭觱觳觶觷觼觾觿言賅訃訇訏訑訒詁託訧訬"
    "訳訹証訾詀詅詆譭詈詊詎詑詒詖詗詘詧詨詵詶詸詹詻詼詿誂誃誄鋤誆誋誑誒誖誙誚誥誧説読誯誶誾諂諄諆諌諍諏諑諕諗諛諝諞諟諠"
    "諡諴諵諶諼謄謆謇謌謍謏謑謖謚謡謦謪謫謳謷謼謾譁譅譆譈譊譌譒譔譖鑫譞譟譩譫譬譱譲譴譸譹譾讅讆讋讌讎讐讒讖讙讜讟谽豁豉"
    "豇豈豊豋豌豏豔豞豖豗豜豝豣豦豨豭豱豳豵豶豷豺豻貅貆貍貎貔貘貙貜貤饜貰餸貺賁賂賏賒賕賙賝賡賧賨賫鬭賮賵賸賺賻賾贇贉贐"
    "贔贕贗赬赭赱赳迄趁趂趄趐趑趒趔趡趦趫趮趯趲趴趵趷趹趺趿跁跂跅跆躓蹌跐跕跖跗跙跛跦跧跩跫跬跮跱跲跴跺跼跽踅踆踈踉踊踒"
    "踖踘踜踟躇躕踠踡踣踤踥踦踧蹺踫踮踰踱踴踶踹踺踼踽躞蹁蹂躪蹎蹐蹓蹔蹕蹚蹜蹝蹟蹠蹡蹢躂蹧蹩蹪蹯鞠蹽躃躄躅躊躋躐躑躒躘躙"
    "躛躝躠躡躦躧躩躭躰躳躶軃軆輥軏軔軘軜軝齶転軥軨軭軱軲轆軷軹軺軽軿輀輂輦輅輇輈輓輗輙輜輞輠輤輬輭輮輳輴輵輶輹輼輾轀轇"
    "轏轑轒轔轕轖轗轘轙轝轞轢轤辠辢辤辵辶辺込辿迅迋迍麿迓迣迤邐迥迨迮迸迺迻迿逄逅逌逍逑逓逕逖逡逭逯逴逶逹遄遅遉遘遛遝遢"
    "遨遫遯遰遴遶遹遻邂邅邉邋邎邕邗邘邛邠邢邧邨邯鄲邰邲邳邴邶邷邽邾邿郃郄郇郈郔郕郗郙郚郜郝郞郟郠郢郪郫郯郰郲郳郴郷郹郾"
    "郿鄀鄄鄆鄇鄈鄋鄍鄎鄏鄐鄑鄒鄔鄕鄖鄗鄘鄚鄜鄞鄠鄢鄣鄤鄦鄩鄫鄬鄮鄯鄱鄶鄷鄹鄺鄻鄾鄿酃酅酆酇酈酊酋酎酏酐酣酔酕醄酖酗酞酡"
    "酢酤酩酴酹酺醁醅醆醊醍醐醑醓醖醝醞醡醤醨醪醭醯醰醱醲醴醵醸醹醼醽醾釂釃釅釆釈鱸鎦閶釓釔釕鈀釙鼢鼴釤釧釪釬釭釱釷釸釹"
    "鈁鈃鈄鈆鈇鈈鈊鈌鈐鈑鈒鈤鈥鈧鈬鈮鈰鈳鐺鈸鈹鈽鈿鉄鉆鉈鉋鉌鉍鉏鉑鉕鉚鉢鉥鉦鉨鉬鉭鉱鉲鉶鉸鉺鉼鉿銍銎銑銕鏤銚銛銠銣銤銥"
    "銦銧銩銪銫銭銰銲銶銻銼銾鋂鋃鋆鋈鋊鋌鋍鋏鋐鋑鋕鋘鋙鋝鋟鋦鋨鋩鋭鋮鋯鋰鋱鋳鋹鋺鋻鏰鐱錀錁錆錇錈錍錏錒錔錙錚錛錞錟錡錤"
    "錩錬録錸錼鍀鍆鍇鍉鍍鍏鍐鍘鍚鍛鍠鍤鍥鍩鍫鍭鍱鍴鍶鍹鍺鍼鍾鎄鎇鎉鎋鎌鎍鎏鎒鎓鎗鎘鎚鎞鎡鎤鎩鎪鎭鎯鎰鎳鎴鎵鎸鎹鎿鏇鏊鏌"
    "鏐鏑鏖鏗鏘鏚鏜鏝鏞鏠鏦鏨鏷鏸鏹鏻鏽鏾鐃鐄鐇鐏鐒鐓鐔鐗馗鐙鐝鐠鐡鐦鐨鐩鐫鐬鐱鐳鐶鐻鐽鐿鑀鑅鑌鑐鑕鑚鑛鑢鑤鑥鑪鑭鑯鑱鑴"
    "鑵鑷钁钃镻閆閈閌閎閒閔閗閟閡関閤閤閧閬閲閹閺閻閼閽閿闇闉闋闐闑闒闓闘闚闞闟闠闤闥阞阢阤阨阬阯阹阼阽陁陑陔陛陜陡陥陬"
    "騭陴険陼陾隂隃隈隒隗隞隠隣隤隩隮隰顴隳隷隹雂雈雉雊雎雑雒雗雘雚雝雟雩雰雱驛霂霅霈霊霑霒霓霙霝霢霣霤霨霩霪霫霮靁靆靉"
    "靑靚靣靦靪靮靰靳靷靸靺靼靿鞀鞃鞄鞌鞗鞙鞚鞝鞞鞡鞣鞨鞫鞬鞮鞶鞹鞾韃韅韉馱韍韎韔韖韘韝韞韡韣韭韮韱韹韺頀颳頄頇頊頍頎頏"
    "頒頖頞頠頫頬顱頯頲頴頼顇顋顑顒顓顔顕顚顜顢顣顬顳颭颮颱颶颸颺颻颽颾颿飀飂飈飌飜飡飣飤飥飩飫飮飱飶餀餂餄餎餇餈餑餔餕"
    "餖餗餚餛餜餟餠餤餧餩餪餫餬餮餱餲餳餺餻餼餽餿饁饅饇饉饊饍饎饐饘饟饢馘馥馝馡馣騮騾馵馹駃駄駅駆駉駋駑駓駔駗駘駙駜駡駢"
    "駪駬駰駴駸駹駽駾騂騄騅騆騉騋騍騏驎騑騒験騕騖騠騢騣騤騧驤騵騶騸騺驀驂驃驄驆驈驊驌驍驎驏驒驔驖驙驦驩驫骺鯁骫骭骯骱骴"
    "骶骷髏骾髁髂髄髆髈髐髑髕髖髙髝髞髟髡髣髧髪髫髭髯髲髳髹髺髽髾鬁鬃鬅鬈鬋鬎鬏鬐鬑鬒鬖鬗鬘鬙鬠鬣鬪鬫鬬鬮鬯鬰鬲鬵鬷魆魈"
    "魊魋魍魎魑魖鰾魛魟魣魦魨魬魴魵魸鮀鮁鮆鮌鮎鮑鮒鮓鮚鮞鮟鱇鮠鮦鮨鮪鮭鮶鮸鮿鯀鯄鯆鯇鯈鯔鯕鯖鯗鯙鯠鯤鯥鯫鯰鯷鯸鯿鰂鰆鶼"
    "鰉鰋鰐鰒鰕鰛鰜鰣鰤鰥鰦鰨鰩鰮鰳鰶鰷鱺鰼鰽鱀鱄鱅鱆鱈鱎鱐鱓鱔鱖鱘鱟鱠鱣鱨鱭鱮鱲鱵鱻鲅鳦鳧鳯鳲鳷鳻鴂鴃鴄鴆鴈鴎鴒鴔鴗鴛"
    "鴦鴝鵒鴟鴠鴢鴣鴥鴯鶓鴳鴴鴷鴽鵀鵁鵂鵓鵖鵙鵜鶘鵞鵟鵩鵪鵫鵵鵷鵻鵾鶂鶊鶏鶒鶖鶗鶡鶤鶦鶬鶱鶲鶵鶸鶹鶺鶿鷀鷁鷃鷄鷇鷈鷉鷊鷏"
    "鷓鷕鷖鷙鷞鷟鷥鷦鷯鷩鷫鷭鷳鷴鷽鷾鷿鸂鸇鸊鸏鸑鸒鸓鸕鸛鸜鸝鹸鹹鹺麀麂麃麄麇麋麌麐麑麒麚麛麝麤麩麪麫麮麯麰麺麾黁黈黌黢"
    "黒黓黕黙黝黟黥黦黧黮黰黱黲黶黹黻黼黽黿鼂鼃鼅鼈鼉鼏鼐鼒鼕鼖鼙鼚鼛鼡鼩鼱鼪鼫鼯鼷鼽齁齆齇齈齉齌齎齏齔齕齗齙齚齜齞齟齬"
    "齠齢齣齧齩齮齯齰齱齵齾龎龑龒龔龖龘龝龡龢龤";

// Define a map with the measurement notations and their replacements.
const std::vector<std::vector<std::string>> measure_dict = {
    {"cm2", "平方厘米"}, {"cm²", "平方厘米"}, {"cm3", "立方厘米"}, {"cm³", "立方厘米"}, {"cm", "厘米"}, {"db", "分贝"}, {"mg", "毫克"}, {"ds", "毫秒"}, {"kg", "千克"}, {"km", "千米"}, {"m2", "平方米"}, {"m²", "平方米"}, {"ms", "毫秒"}, {"m³", "立方米"}, {"m3", "立方米"}, {"ml", "毫升"}, {"mm", "毫米"}, {"m", "米"}, {"s", "秒"}, {"l", "升"}, {"g", "克"}};

std::unordered_map<std::string, std::string> DIGITS = {{"0", "零"}, {"1", "一"}, {"2", "二"}, {"3", "三"}, {"4", "四"}, {"5", "五"}, {"6", "六"}, {"7", "七"}, {"8", "八"}, {"9", "九"}};

std::vector<std::pair<int, std::string>> UNITS = {{1, "十"}, {2, "百"}, {3, "千"}, {4, "万"}, {8, "亿"}};
std::unordered_map<int, int> UNITS_POS_MAP = {{1, 0}, {2, 1}, {3, 2}, {4, 3}, {8, 4}};

std::unordered_map<std::string, int> language_tone_start_map = {{"zh", 0}, {"jp", 6}, {"en", 8}};
std::unordered_map<std::string, int> language_id_map = {{"zh", 0}, {"jp", 1}, {"en", 2}};

std::vector<std::string> symbols = {
    "_", "AA", "E", "EE", "En", "N", "OO", "V", "a", "a:", "aa", "ae", "ah", "ai", "an", "ang",
    "ao", "aw", "ay", "b", "by", "c", "ch", "d", "dh", "dy", "e", "e:", "eh", "ei", "en", "eng",
    "er", "ey", "f", "g", "gy", "h", "hh", "hy", "i", "i0", "i:", "ia", "ian", "iang", "iao", "ie",
    "ih", "in", "ing", "iong", "ir", "iu", "iy", "j", "jh", "k", "ky", "l", "m", "my", "n", "ng",
    "ny", "o", "o:", "ong", "ou", "ow", "oy", "p", "py", "q", "r", "ry", "s", "sh", "t", "th",
    "ts", "ty", "u", "u:", "ua", "uai", "uan", "uang", "uh", "ui", "un", "uo", "uw", "v", "van", "ve",
    "vn", "w", "x", "y", "z", "zh", "zy", "!", "?", "…", ",", ".", "\"", "-", "SP", "UNK"};

std::unordered_map<std::string, std::string> punctuation_map = {
    {"：", ","}, {"；", ","}, {"，", ","}, {"。", "."}, {"！", "!"}, {"？", "?"}, {"\n", "."}, {"·", ","}, {"、", ","}, {"...", "…"}, {"$", "."}, {"“", "'"}, {"”", "'"}, {"‘", "'"}, {"’", "'"}, {"（", "'"}, {"）", "'"}, {"(", "'"}, {")", "'"}, {"《", "'"}, {"》", "'"}, {"【", "'"}, {"】", "'"}, {"[", "'"}, {"]", "'"}, {"—", "-"}, {"～", "-"}, {"~", "-"}, {"「", "'"}, {"」", "'"}};

// 替换字符串中的所有匹配项到新字符串，实现Python中str.replace的功能
std::string StrReplaceAll(std::string &str, const std::string &from, const std::string &to)
{
    size_t start_pos = 0;
    // 循环查找直到找不到更多匹配项
    while ((start_pos = str.find(from, start_pos)) != std::string::npos)
    {
        // 替换发现的子字符串
        str.replace(start_pos, from.length(), to);
        // 移动到这次替换之后的位置
        start_pos += to.length();
    }
    return str;
}

std::string ReplaceCurrency(const std::string &sentence)
{
    std::string result = sentence;
    // 创建正则表达式对象，注意在C++中反斜杠需要转义
    std::regex regexPattern1(R"(¥(\d+))");
    // 美元符号在正则表达式中有特殊含义，需要进行转义
    std::regex regexPattern2(R"(\$(\d+))");

    // 使用std::regex_replace替换文本中的模式
    result = std::regex_replace(result, regexPattern1, R"($1元)");
    result = std::regex_replace(result, regexPattern2, R"($1美元)");
    return result;
}

std::string ReplaceCompare(const std::string &sentence)
{
    std::string result = sentence;
    // 创建正则表达式对象，注意在C++中反斜杠需要转义
    std::regex regexPattern1(R"((\d+)(:|：)(\d+))");

    // 使用std::regex_replace替换文本中的模式
    result = std::regex_replace(result, regexPattern1, R"($1比$3)");
    return result;
}

std::string ReplaceTyperead(const std::string &sentence)
{
    std::string result = sentence;
    // 创建正则表达式对象，注意在C++中反斜杠需要转义
    std::regex regexPattern1(R"(([a-zA-Z])-(\d+))");

    // 使用std::regex_replace替换文本中的模式
    result = std::regex_replace(result, regexPattern1, R"($1杠$2)");
    return result;
}

std::string ReplaceTyperead2(const std::string &sentence)
{
    std::string result = sentence;
    // 创建正则表达式对象，注意在C++中反斜杠需要转义
    std::regex regexPattern1(R"(([a-zA-Z])-([a-zA-Z]))");

    // 使用std::regex_replace替换文本中的模式
    result = std::regex_replace(result, regexPattern1, R"($1杠$2)");
    return result;
}

std::string ReplaceSpecificCommaNumbers(const std::string &text)
{
    std::regex pattern(R"((\d+)(,000)+)");

    // The resulting string
    std::string result;
    // Begin and end iterators for the matches
    auto begin = std::sregex_iterator(text.begin(), text.end(), pattern);
    auto end = std::sregex_iterator();

    // Track where in the original string we are
    size_t lastMatchEnd = 0;

    // Iterate through all regex matches
    for (std::sregex_iterator i = begin; i != end; ++i)
    {
        std::smatch match = *i;
        // Add the text before the match to the result
        result += text.substr(lastMatchEnd, match.position() - lastMatchEnd);

        // Get the matched text and erase commas
        std::string matched = match.str(0);
        matched.erase(std::remove(matched.begin(), matched.end(), ','), matched.end());

        // Add the modified matched text to the result
        result += matched;

        // Update the last match end position
        lastMatchEnd = match.position() + match.length();
    }

    // Add any remaining text after the last match to the result
    result += text.substr(lastMatchEnd);

    return result;
}

std::string RemoveEmptyLines(const std::string &text)
{
    // Create a regex pattern to match empty lines (lines with only spaces or tabs)
    std::regex pattern(R"(^[\s\t]*\r?\n)");

    // Use regex_replace to remove the matched patterns from the input text
    std::string result = std::regex_replace(text, pattern, "");

    return result;
}

std::string AddPeriodBeforeNewline(const std::string &text)
{
    // 定义标点符号
    std::string punctuation = ".!?;:：，,。！？";
    // 替换模式：查找非标点符号加换行符，并在换行符前添加句号
    // 注意双反斜杠的使用是因为在C++中，单个反斜杠被视为转义序列的开始
    std::regex pattern("([^" + punctuation + "])\n");

    // 使用 regex_replace 替换文本中的模式
    std::string result = std::regex_replace(text, pattern, "$1。\n");

    return result;
}

std::string ReplaceOneMeasure(const std::string &text, const std::string &unit, const std::string &cn_word)
{
    std::string result = text; // 创建原始字符串的副本以进行修改
    size_t pos = result.find(unit);

    // 循环直到找不到 "ms"
    while (pos != std::string::npos)
    {
        // 确保 "ms" 前面是数字，避免替换 "eas" 中的 "ms"
        if (pos == 0 || isdigit(result[pos - 1]) || (pos > 1 && result[pos - 1] == '.' && isdigit(result[pos - 2])))
        {
            // 替换 "ms" 为 "毫秒"
            result.replace(pos, 2, cn_word);
        }
        // 继续查找下一个 "ms"
        pos = result.find(unit, pos + 3); // 从 "毫秒" 后继续查找
    }

    return result;
}

std::string ReplaceMeasure(const std::string &sentence)
{
    std::string out = sentence;
    for (auto &p : measure_dict)
    {
        out = ReplaceOneMeasure(out, p[0], p[1]);
    }
    return out;
}

// 通用的正则表达式替换函数，例如str_replace_using_re_sub("3ml", R"((\d+)\s?ml)", "$1 毫升")会将3ml替换为3 毫升
std::string ReReplace(const std::string &str, const std::string &pattern, const std::string &replacement)
{
    std::regex regex_pattern(pattern);
    std::string result = std::regex_replace(str, regex_pattern, replacement);
    return result;
}

std::vector<std::string> GetValue(const std::string &value_string, bool use_zero)
{
    std::string stripped = value_string;
    stripped.erase(0, stripped.find_first_not_of('0')); // 移除前导0
    std::vector<std::string> result;

    if (stripped.empty())
    {
        return result; // 如果剥离后的字符串为空，返回空列表
    }
    else if (stripped.size() == 1)
    {
        if (use_zero && stripped.size() < value_string.size())
        {
            result.push_back(DIGITS["0"]); // 如果原始字符串有前导0，添加"零"
        }
        result.push_back(DIGITS[stripped]); // 添加对应的数字
        return result;
    }
    else
    {
        int largest_unit = -1;
        for (auto it = UNITS.rbegin(); it != UNITS.rend(); ++it)
        {
            if (it->first < stripped.size())
            {
                largest_unit = it->first; // 找到最大的单位
                break;
            }
        }
        if (largest_unit == -1)
        {
            // 如果没有找到合适的单位，这是一个异常情况，可以抛出一个异常或者做其他处理
            return result;
        }

        // 分割字符串并递归处理
        std::string first_part = value_string.substr(0, value_string.size() - largest_unit);
        std::string second_part = value_string.substr(value_string.size() - largest_unit);
        std::vector<std::string> first_result = GetValue(first_part);
        result.insert(result.end(), first_result.begin(), first_result.end()); // 添加第一部分的结果
        result.push_back(UNITS[UNITS_POS_MAP[largest_unit]].second);           // 添加单位
        std::vector<std::string> second_result = GetValue(second_part);
        result.insert(result.end(), second_result.begin(), second_result.end()); // 添加第二部分的结果

        return result;
    }
}

std::string VerbalizeCardinal(const std::string &value_string)
{
    if (value_string.empty())
    {
        return "";
    }
    std::string stripped = value_string;
    stripped.erase(0, stripped.find_first_not_of('0'));
    if (stripped.empty())
    {
        return DIGITS["0"];
    }
    std::vector<std::string> result_symbols = GetValue(stripped);
    if (result_symbols.size() >= 2 && result_symbols[0] == DIGITS["1"] &&
        result_symbols[1] == UNITS[UNITS_POS_MAP[1]].second)
    {
        result_symbols.erase(result_symbols.begin());
    }
    std::string result;
    for (const auto &symbol : result_symbols)
    {
        result += symbol;
    }
    return result;
}

std::string VerbalizeDigit(const std::string &value_string, bool alt_one)
{
    std::string result;
    for (char digit : value_string)
    {
        result += DIGITS[std::string(1, digit)];
    }
    if (alt_one)
    {
        result = StrReplaceAll(result, "一", "幺");
    }
    return result;
}

std::string Num2Str(const std::string &value_string)
{
    size_t dot_pos = value_string.find('.');
    std::string integer = (dot_pos == std::string::npos) ? value_string : value_string.substr(0, dot_pos);
    std::string decimal = (dot_pos == std::string::npos) ? "" : value_string.substr(dot_pos + 1);
    std::string result = VerbalizeCardinal(integer);
    decimal.erase(std::find_if(decimal.rbegin(), decimal.rend(), [](char c)
                               { return c != '0'; })
                      .base(),
                  decimal.end());
    if (!decimal.empty())
    {
        result = result.empty() ? "零" : result;
        result += "点" + VerbalizeDigit(decimal);
    }
    return result;
}

std::string TimeNum2Str(const std::string &num_string)
{
    std::string result = Num2Str(num_string.substr(num_string.find_first_not_of('0')));
    if (num_string.front() == '0')
    {
        result = DIGITS["0"] + result;
    }
    return result;
}

// 利用传入的函数来对正则表达式匹配到的部分进行替换
std::string RePeplaceByFunc(const std::string &text, const std::regex &pattern,
                            std::function<std::string(const std::smatch &)> func)
{
    std::string output;
    std::string::const_iterator search_start(text.cbegin());
    std::smatch match;

    while (std::regex_search(search_start, text.cend(), match, pattern))
    {
        output += match.prefix().str() + func(match);
        search_start = match.suffix().first;
    }
    output += std::string(search_start, text.cend()); // Append the rest of the string after the last match

    return output;
}

// 正则表达式的替换函数
std::string ReplaceDate(const std::smatch &match)
{
    std::string year = match[1].str();
    std::string month = match[3].str();
    std::string day = match[5].str();
    std::string suffix = match[9].str();
    std::string result;
    if (!year.empty())
    {
        result += VerbalizeDigit(year) + "年";
    }
    if (!month.empty())
    {
        result += VerbalizeCardinal(month) + "月";
    }
    if (!day.empty())
    {
        result += VerbalizeCardinal(day) + suffix;
    }
    return result;
}
std::string RegexReplaceDate(const std::string &sentence)
{
    std::regex pattern(R"((\d{4}|\d{2})年((0?[1-9]|1[0-2])月)?(((0?[1-9])|((1|2)[0-9])|30|31)([日号]))?)");
    return RePeplaceByFunc(sentence, pattern, ReplaceDate);
}

std::string replace_date2(const std::smatch &match)
{
    auto year = match[1].str();
    auto month = match[3].str();
    auto day = match[4].str();

    std::string result;
    if (!year.empty())
    {
        result += VerbalizeDigit(year) + "年";
    }
    if (!month.empty())
    {
        result += VerbalizeCardinal(month) + "月";
    }
    if (!day.empty())
    {
        result += VerbalizeCardinal(day) + "日";
    }
    return result;
}

std::string RegexReplaceDate2(const std::string &sentence)
{
    std::regex pattern(R"((\d{4})([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01]))");
    return RePeplaceByFunc(sentence, pattern, replace_date2);
}

// 将10:00:00～12:00:00的时间区间转换为十点到十二点
std::string ReplaceTime(const std::smatch &match)
{
    bool is_range = match.size() > 6;

    std::string hour = match[1];
    std::string minute = match[2];
    std::string second = match[4];
    std::string result = Num2Str(hour) + "点";

    if (!minute.empty() && std::stoi(minute) != 0)
    {
        if (std::stoi(minute) == 30)
        {
            result += "半";
        }
        else
        {
            result += TimeNum2Str(minute) + "分";
        }
    }

    if (!second.empty() && std::stoi(second) != 0)
    {
        result += TimeNum2Str(second) + "秒";
    }

    if (is_range)
    {
        std::string hour_2 = match[6];
        std::string minute_2 = match[7];
        std::string second_2 = match[9];

        result += "至";
        result += Num2Str(hour_2) + "点";

        if (!minute_2.empty() && std::stoi(minute_2) != 0)
        {
            if (std::stoi(minute_2) == 30)
            {
                result += "半";
            }
            else
            {
                result += TimeNum2Str(minute_2) + "分";
            }
        }

        if (!second_2.empty() && std::stoi(second_2) != 0)
        {
            result += TimeNum2Str(second_2) + "秒";
        }
    }

    return result;
}

// 匹配10:00:00～12:00:00的时间区间
std::string RegexReplaceTimeRange(const std::string &sentence)
{
    std::regex pattern(R"(([0-1]?[0-9]|2[0-3]))"
                       R"(:([0-5][0-9]))"
                       R"((:([0-5][0-9]))?)"
                       R"((~|-))"
                       R"(([0-1]?[0-9]|2[0-3]))"
                       R"(:([0-5][0-9]))"
                       R"((:([0-5][0-9]))?)");

    return RePeplaceByFunc(sentence, pattern, ReplaceTime);
}

// 匹配10:00:00这样的时间表示
std::string RegexReplaceTime(const std::string &sentence)
{
    const std::regex pattern(R"(([0-1]?[0-9]|2[0-3]):([0-5][0-9])(:([0-5][0-9]))?)");
    return RePeplaceByFunc(sentence, pattern, ReplaceTime);
}

std::string replace_temperature(const std::smatch &match)
{
    std::string sign = match[1];        // Sign part (- for negative temperatures)
    std::string temperature = match[2]; // Numeric part of temperature
    std::string unit = match[4];        // Unit part (°C, ℃, 度, or 摄氏度)

    std::ostringstream result;
    result << (sign == "-" ? "零下" : "") << Num2Str(temperature) << (unit == "摄氏度" ? "摄氏度" : "度");

    return result.str();
}

std::string RegexReplaceTemperature(const std::string &sentence)
{
    const std::regex pattern(R"((-?)(\d+(\.\d+)?)(°|°C|℃|度|摄氏度))");
    return RePeplaceByFunc(sentence, pattern, replace_temperature);
}

std::string ReplaceFrac(const std::smatch &match)
{
    std::string sign = match[1];
    std::string nominator = match[2];
    std::string denominator = match[3];

    // Apply the sign conversion and number-to-string conversion
    sign = sign == "-" ? "负" : "";
    nominator = Num2Str(nominator);
    denominator = Num2Str(denominator);

    std::ostringstream result;
    result << sign << denominator << "分之" << nominator;
    return result.str();
}

std::string RegexReplaceFrac(const std::string &sentence)
{
    const std::regex pattern(R"((-?)(\d+)/(\d+))");
    return RePeplaceByFunc(sentence, pattern, ReplaceFrac);
}

std::string ReplacePercentage(const std::smatch &match)
{
    std::string sign = match[1];
    std::string percent = match[2];

    // Apply the sign conversion and number-to-string conversion
    sign = sign == "-" ? "负" : "";
    percent = Num2Str(percent);

    std::ostringstream result;
    result << sign << "百分之" << percent;
    return result.str();
}

std::string RegexReplacePercentage(const std::string &sentence)
{
    const std::regex pattern(R"((-?)(\d+(\.\d+)?)%)");
    return RePeplaceByFunc(sentence, pattern, ReplacePercentage);
}

std::string Phone2Str(const std::string &phone_string, bool mobile)
{
    std::string result;
    std::istringstream iss(phone_string);
    std::ostringstream oss;
    std::string part;

    if (mobile)
    {
        // Split by space, but first remove the '+' prefix if present
        std::string temp = phone_string;
        if (temp.front() == '+')
        {
            temp.erase(0, 1);
        }
        iss.str(temp);
        std::vector<std::string> parts;
        while (std::getline(iss, part, ' '))
        {
            parts.push_back(VerbalizeDigit(part, true));
        }
        // Join parts with "，"
        for (size_t i = 0; i < parts.size(); ++i)
        {
            oss << parts[i];
            if (i < parts.size() - 1)
            {
                oss << "，";
            }
        }
    }
    else
    {
        // Split by hyphen '-'
        while (std::getline(iss, part, '-'))
        {
            oss << VerbalizeDigit(part, true);
            if (!iss.eof())
            {
                oss << "，";
            }
        }
    }

    result = oss.str();
    return result;
}

std::string ReplacePhoneNumber(const std::smatch &match) { return Phone2Str(match.str(0), true); }

std::string RegexReplaceMobile(const std::string &sentence)
{
    // const std::regex pattern(R"((?<!\d)((\+?86 ?)?1([38]\d|5[0-35-9]|7[678]|9[89])\d{8})(?!\d))");
    const std::regex pattern(R"((\+?86 ?)?1([38]\d|5[0-35-9]|7[678]|9[89])\d{8})");
    return RePeplaceByFunc(sentence, pattern, ReplacePhoneNumber);
}

std::string RegexReplacePhone(const std::string &sentence)
{
    const std::regex pattern(R"((0(10|2[1-3]|[3-9]\d{2})-?)?[1-9]\d{6,7})");
    return RePeplaceByFunc(sentence, pattern, ReplacePhoneNumber);
}

std::string RegexReplaceNationalUniformNumber(const std::string &sentence)
{
    const std::regex pattern(R"(400(-)?\d{3}(-)?\d{4})");
    return RePeplaceByFunc(sentence, pattern, ReplacePhoneNumber);
}

std::string ReplaceNumber(const std::smatch &match)
{
    std::string sign = match[1].str();
    std::string number = match[2].str();
    std::string pure_decimal = match[5].str();
    std::string result;

    if (!pure_decimal.empty())
    {
        result = Num2Str(pure_decimal);
    }
    else
    {
        sign = sign == "-" ? "负" : "";
        number = Num2Str(number);
        result = sign + number;
    }

    return result;
}

std::string ReplaceRange(const std::smatch &match)
{
    std::string first = match[1].str();
    std::string second = match[8].str();

    // 使用正则表达式进行替换
    const std::regex RE_NUMBER(R"((-?)((\d+)(\.\d+)?)|(\.(\d+)))");

    std::string replaced_first = RePeplaceByFunc(first, RE_NUMBER, ReplaceNumber);
    std::string replaced_second = RePeplaceByFunc(second, RE_NUMBER, ReplaceNumber);

    std::ostringstream result;
    result << replaced_first << "到" << replaced_second;
    return result.str();
}

std::string RegexReplaceRange(const std::string &sentence)
{
    std::string result = sentence;
    // 创建正则表达式对象，注意在C++中反斜杠需要转义
    std::regex regexPattern1(R"((\d+)[~～](\d+))");

    // 使用std::regex_replace替换文本中的模式
    result = std::regex_replace(result, regexPattern1, R"($1到$2)");
    return result;
}

// C++ 版本的 replace_negative_num 函数
std::string ReplaceNegativeNum(const std::smatch &match)
{
    std::string sign = match[1].str();
    std::string number = match[2].str();
    sign = sign == "-" ? "负" : ""; // 如果捕获到符号“-”，则转换为中文的“负”
    number = Num2Str(number);       // 调用 num2str 函数将数字转换为中文表述
    return sign + number;           // 返回拼接的中文负数表述
}

std::string RegexReplaceNegativeNum(const std::string &sentence)
{
    const std::regex pattern(R"((-)(\d+))");
    return RePeplaceByFunc(sentence, pattern, ReplaceNegativeNum);
}

std::string RegexReplaceDecimalNum(const std::string &sentence)
{
    const std::regex pattern(R"((-?)((\d+)(\.\d+))|(\.(\d+)))");
    return RePeplaceByFunc(sentence, pattern, ReplaceNumber);
}

std::string replace_positive_quantifier(const std::smatch &match)
{
    std::string number = match[1].str();
    std::string match_2 = match[2].str();
    if (match_2 == "+")
    {
        match_2 = "多";
    }
    match_2 = match_2.empty() ? "" : match_2;
    std::string quantifiers = match[3].str();
    number = Num2Str(number);
    return number + match_2 + quantifiers;
}

std::string RegexReplacePositiveQuantifier(const std::string &sentence)
{
    // 正整数+量词
    const std::regex pattern(
        R"((\d+)([多余几\+])?(发|次|封|艘|把|目|套|段|人|所|朵|匹|张|座|回|场|尾|条|个|首|阙|阵|网|炮|顶|丘|棵|只|支|袭|辆|挑|担|颗|壳|窠|曲|墙|群|腔|砣|座|客|贯|扎|捆|刀|令|打|手|罗|坡|山|岭|江|溪|钟|队|单|双|对|出|口|头|脚|板|跳|枝|件|贴|针|线|管|名|位|身|堂|课|本|页|家|户|层|丝|毫|厘|分|钱|两|斤|担|铢|石|钧|锱|忽|(千|毫|微)克|毫|厘|(公)分|分|寸|尺|丈|里|寻|常|铺|程|(千|分|厘|毫|微)米|米|撮|勺|合|升|斗|石|盘|碗|碟|叠|桶|笼|盆|盒|杯|钟|斛|锅|簋|篮|盘|桶|罐|瓶|壶|卮|盏|箩|箱|煲|啖|袋|钵|年|月|日|季|刻|时|周|天|秒|分|小时|旬|纪|岁|世|更|夜|春|夏|秋|冬|代|伏|辈|丸|泡|粒|颗|幢|堆|条|根|支|道|面|片|张|颗|块|元|(亿|千万|百万|万|千|百)|(亿|千万|百万|万|千|百|美|)元|(亿|千万|百万|万|千|百|十|)吨|(亿|千万|百万|万|千|百|)块|角|毛|分))");
    return RePeplaceByFunc(sentence, pattern, replace_positive_quantifier);
}

std::string RegexReplace2WithQuantifier(const std::string &sentence)
{

    // 定义量词列表
    std::string quantifiers = "发|次|封|艘|把|目|套|段|人|所|朵|匹|张|座|回|场|尾|条|个|首|阙|阵|网|炮|顶|丘|棵|只|支|袭|辆|挑|担|颗|壳|窠|曲|墙|群|腔|砣|座|客|贯|扎|捆|刀|令|打|手|罗|坡|山|岭|江|溪|钟|队|单|双|对|出|口|头|脚|板|跳|枝|件|贴|针|线|管|名|位|身|堂|课|本|页|家|户|层|丝|毫|厘|分|钱|两|斤|担|铢|石|钧|锱|忽|(千|毫|微)克|毫|厘|(公)分|分|寸|尺|丈|里|寻|常|铺|程|(千|分|厘|毫|微)米|米|撮|勺|合|升|斗|石|盘|碗|碟|叠|桶|笼|盆|盒|杯|钟|斛|锅|簋|篮|盘|桶|罐|瓶|壶|卮|盏|箩|箱|煲|啖|袋|钵|年|月|日|季|刻|时|周|天|秒|分|小时|旬|纪|岁|世|更|夜|春|夏|秋|冬|代|伏|辈|丸|泡|粒|颗|幢|堆|条|根|支|道|面|片|张|颗|块|元|(亿|千万|百万|万|千|百)|(亿|千万|百万|万|千|百|美|)元|(亿|千万|百万|万|千|百|十|)吨|(亿|千万|百万|万|千|百|)块|角|毛|分";

    std::string result = sentence;
    // 构建正则表达式，匹配数字2后跟任意空白字符和量词
    std::regex pattern("(\\b2\\b)(\\s*(" + quantifiers + "))");
    // 使用std::regex_replace进行替换
    result = std::regex_replace(result, pattern, "两$3");
    return result;
}

std::string ReplaceDefaultNum(const std::smatch &match)
{
    std::string number = match[0].str();
    return VerbalizeDigit(number, true);
}

std::string RegexReplaceDefaultNum(const std::string &sentence)
{
    const std::regex pattern(R"(\d{3}\d*)");
    return RePeplaceByFunc(sentence, pattern, ReplaceDefaultNum);
}

std::string RegexReplaceNumber(const std::string &sentence)
{
    const std::regex pattern(R"((-?)((\d+)(\.\d+)?)|(\.(\d+)))");
    return RePeplaceByFunc(sentence, pattern, ReplaceNumber);
}

std::string PostReplace(const std::string &sentence)
{
    std::string result = sentence;

    // Define a vector of pairs for the find and replace operations
    std::vector<std::pair<std::string, std::string>> replacements = {
        {"/", "每"},
        //        {"~", "至"},
        //        {"～", "至"},
        {"=", "等于"},
        {"①", "一"},
        {"②", "二"},
        {"③", "三"},
        {"④", "四"},
        {"⑤", "五"},
        {"⑥", "六"},
        {"⑦", "七"},
        {"⑧", "八"},
        {"⑨", "九"},
        {"⑩", "十"},
        {"α", "阿尔法"},
        {"β", "贝塔"},
        {"γ", "伽玛"},
        {"Γ", "伽玛"},
        {"δ", "德尔塔"},
        {"Δ", "德尔塔"},
        {"ε", "艾普西龙"},
        {"ζ", "捷塔"},
        {"η", "依塔"},
        {"θ", "西塔"},
        {"Θ", "西塔"},
        {"ι", "艾欧塔"},
        {"κ", "喀帕"},
        {"λ", "拉姆达"},
        {"Λ", "拉姆达"},
        {"μ", "缪"},
        {"ν", "拗"},
        {"ξ", "克西"},
        {"Ξ", "克西"},
        {"ο", "欧米克伦"},
        {"π", "派"},
        {"Π", "派"},
        {"ρ", "肉"},
        {"ς", "西格玛"},
        {"Σ", "西格玛"},
        {"σ", "西格玛"},
        {"τ", "套"},
        {"υ", "宇普西龙"},
        {"φ", "服艾"},
        {"Φ", "服艾"},
        {"χ", "器"},
        {"ψ", "普赛"},
        {"Ψ", "普赛"},
        {"ω", "欧米伽"},
        {"Ω", "欧米伽"},
        {"+", "加"},
        {"-", "减"},
    };

    for (const auto &[findStr, replaceStr] : replacements)
    {
        size_t pos = 0;
        // Replace all occurrences of findStr with replaceStr
        while ((pos = result.find(findStr, pos)) != std::string::npos)
        {
            result.replace(pos, findStr.length(), replaceStr);
            pos += replaceStr.length();
        }
    }

    // 将特殊符号都去掉
    std::vector<std::string> to_comma_words = {"(", ")", "（", "）"};
    std::vector<std::string> to_blank_words = {"《", "》", "<", ">", "&", "【", "】", "{", "}", "'", "“", "”", "…", "——", "‘", "‘", "^", "#", "@", "_", "\\", "=", "-", "|"};
    for (auto &c : to_comma_words)
    {
        if (result.find(c) != std::string::npos)
        {
            StrReplaceAll(result, c, ",");
        }
    }

    for (auto &c : to_blank_words)
    {
        if (result.find(c) != std::string::npos)
        {
            StrReplaceAll(result, c, "");
        }
    }
    // result = std::regex_replace(result, std::regex("[（(]"), ",");
    // 使用 C++ 中的正则表达式符号替换
    // result = std::regex_replace(result,
    //                                std::regex("[-——《》【】<=>{}()（）#&@“”^_|…]"),
    //                                "");

    return result;
}

// 返回 UTF-8 字符的长度
int Utf8CharLength(char ch)
{
    if ((ch & 0x80) == 0)
        return 1;
    if ((ch & 0xE0) == 0xC0)
        return 2;
    if ((ch & 0xF0) == 0xE0)
        return 3;
    if ((ch & 0xF8) == 0xF0)
        return 4;
    return 0; // 错误的 UTF-8 编码
}

// 将 UTF-8 编码的字符串拆分为单个的字符，返回字符列表，注意每个字符格式还是string
std::vector<std::string> SplitUtf8String(const std::string &utf8_str)
{
    std::vector<std::string> characters;
    for (size_t i = 0; i < utf8_str.size();)
    {
        int len = Utf8CharLength(utf8_str[i]);
        if (len > 0)
        {
            characters.push_back(utf8_str.substr(i, len));
            i += len; // 跳过当前 UTF-8 编码的字符
        }
        else
        {
            // 处理无效的 UTF-8 字符序列
            std::cerr << "Invalid UTF-8 sequence encountered!" << std::endl;
            ++i; // 跳过无效的字节
        }
    }
    return characters;
}
std::string HanSubstr(const std::vector<std::string> &hans, int begin, size_t size)
{
    std::string res = "";
    int real_size = std::min(size, hans.size() - begin);
    for (int i = begin; i < begin + real_size; i++)
    {
        res += hans[i];
    }
    return res;
}

// 将 UTF-8 编码的字符串的第一个字符转换为 Unicode 码点
uint32_t Utf8ToUnicode(const std::string &utf8_str)
{
    int len = Utf8CharLength(utf8_str[0]);
    if (len == 0)
        return 0; // 错误的 UTF-8 编码
    uint32_t unicode_char = 0;

    // 读取 UTF-8 字节序列并转换为 Unicode 码点
    if (len == 1)
    {
        unicode_char = static_cast<unsigned char>(utf8_str[0]);
    }
    else
    {
        int offset = (0xFF >> (len + 1)) & utf8_str[0]; // UTF-8 的第一个字节中的有效位
        unicode_char = offset;
        for (int i = 1; i < len; ++i)
        {
            offset = 0x3F & utf8_str[i]; // UTF-8 连续字节中的有效位
            unicode_char = (unicode_char << 6) | offset;
        }
    }
    return unicode_char;
}

// 检查给定的 Unicode 码点是否是汉字
bool IsChinese(uint32_t unicode_char)
{
    return (unicode_char >= 0x4E00 && unicode_char <= 0x9FFF) || (unicode_char >= 0x3400 && unicode_char <= 0x4DBF) ||
           (unicode_char >= 0x20000 && unicode_char <= 0x2A6DF) ||
           (unicode_char >= 0x2A700 && unicode_char <= 0x2B73F) ||
           (unicode_char >= 0x2B740 && unicode_char <= 0x2B81F) ||
           (unicode_char >= 0x2B820 && unicode_char <= 0x2CEAF) || (unicode_char >= 0xF900 && unicode_char <= 0xFAFF) ||
           (unicode_char >= 0x2F800 && unicode_char <= 0x2FA1F); // 扩展和兼容区间
}

// 判断字符是否为英文字母
bool IsAlphabet(char32_t char_code)
{
    return (char_code >= 0x0040 && char_code <= 0x005A) || (char_code >= 0x0061 && char_code <= 0x007A);
}

// 判断字符是否为英文字母和中文以外的其他字符
bool IsOther(char32_t char_code)
{
    if (IsChinese(char_code) || IsAlphabet(char_code))
    {
        return false;
    }
    return true;
}

// std::string traditional_to_simplified(const std::string& text, const std::unordered_map<char, char>& t2s_dict) {
std::string TraditionalToSimplified(const std::string &text)
{
    std::unordered_map<std::string, std::string> s2t_dict;
    std::unordered_map<std::string, std::string> t2s_dict;
    auto simp_chars = SplitUtf8String(simplified_characters);
    auto trad_chars = SplitUtf8String(traditional_characters);
    for (size_t i = 0; i < simp_chars.size(); ++i)
    {
        s2t_dict[simp_chars[i]] = trad_chars[i];
        t2s_dict[trad_chars[i]] = simp_chars[i];
    }

    std::vector<std::string> utf8_chars = SplitUtf8String(text);
    std::string result;
    for (const auto &ch : utf8_chars)
    {
        auto it = t2s_dict.find(ch);
        result += (it != t2s_dict.end()) ? it->second : ch;
    }
    return result;
}

// Function to convert simplified to traditional Chinese
std::string SimplifiedToTraditional(const std::string &text)
{
    std::unordered_map<std::string, std::string> s2t_dict;
    std::unordered_map<std::string, std::string> t2s_dict;
    auto simp_chars = SplitUtf8String(simplified_characters);
    auto trad_chars = SplitUtf8String(traditional_characters);
    for (size_t i = 0; i < simp_chars.size(); ++i)
    {
        s2t_dict[simp_chars[i]] = trad_chars[i];
        t2s_dict[trad_chars[i]] = simp_chars[i];
    }

    std::vector<std::string> utf8_chars = SplitUtf8String(text);
    std::string result;
    for (const auto &ch : utf8_chars)
    {
        auto it = s2t_dict.find(ch);
        result += (it != s2t_dict.end()) ? it->second : ch;
    }
    return result;
}

std::string FullWidthToHalfWidth(const std::string &sentence)
{
    std::unordered_map<char32_t, char> F2H_ASCII_LETTERS;
    std::unordered_map<char32_t, char> F2H_DIGITS;
    std::unordered_map<char32_t, char> F2H_SPACE;

    // 填充字母映射
    for (char c = 'A'; c <= 'Z'; ++c)
    {
        F2H_ASCII_LETTERS[static_cast<char32_t>(c) + 65248] = c;
        F2H_ASCII_LETTERS[static_cast<char32_t>(c) + 65248 + 32] = c + 32; // 小写
    }
    // 填充数字映射
    for (char c = '0'; c <= '9'; ++c)
    {
        F2H_DIGITS[static_cast<char32_t>(c) + 65248] = c;
    }
    // 填充空格映射
    F2H_SPACE[0x3000] = ' ';

    std::u32string wide_sentence = std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>{}.from_bytes(sentence);
    std::string result;

    for (char32_t wc : wide_sentence)
    {
        if (F2H_ASCII_LETTERS.find(wc) != F2H_ASCII_LETTERS.end())
        {
            result.push_back(F2H_ASCII_LETTERS[wc]);
        }
        else if (F2H_DIGITS.find(wc) != F2H_DIGITS.end())
        {
            result.push_back(F2H_DIGITS[wc]);
        }
        else if (F2H_SPACE.find(wc) != F2H_SPACE.end())
        {
            result.push_back(F2H_SPACE[wc]);
        }
        else
        {
            result += std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>{}.to_bytes(wc);
        }
    }

    return result;
}

std::string ConcatStrList(const std::vector<std::string> &strs, const std::string &delimiter)
{
    std::string out = delimiter;
    for (auto &s : strs)
    {
        out += s + delimiter;
    }
    return out;
}

std::string ConcatIntList(const std::vector<int> &ints, const std::string &delimiter)
{
    std::string out = delimiter;
    for (auto &s : ints)
    {
        out += std::to_string(s) + delimiter;
    }
    return out;
}

std::string ConcatFloatList(const std::vector<float> &fs, const std::string &delimiter)
{
    std::string out = delimiter;
    for (auto &s : fs)
    {
        out += std::to_string(s) + delimiter;
    }
    return out;
}

std::string Concat2dFloatList(const std::vector<std::vector<float>> &fs_2d, const std::string &delimiter)
{
    std::string out = delimiter;
    for (auto &fs : fs_2d)
    {
        for (auto &s : fs)
        {
            out += std::to_string(s) + delimiter;
        }
    }
    return out;
}

// 判断字符串中是否包含数字
bool ContainsNumber(const std::string &str)
{
    std::regex re_number(R"(\d)");
    return std::regex_search(str, re_number);
}

std::vector<int16_t> ConcatAudio(std::vector<std::vector<int16_t>> audio_list, float pad_length, int sample_rate)
{
    size_t pad_samples_count = static_cast<size_t>(sample_rate * pad_length);
    // Create a vector of zeros for padding
    std::vector<int16_t> empty_audio(pad_samples_count, 0);
    
    std::vector<int16_t> res;
    for (const auto &innerVec : audio_list)
    {
        res.insert(res.end(), innerVec.begin(), innerVec.end());
        res.insert(res.end(), empty_audio.begin(), empty_audio.end());
    }
    return res;
}

bool HanIsDigit(const std::string &word)
{
    std::vector<std::string> han_number = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
    return std::find(han_number.begin(), han_number.end(), word) != han_number.end();
}

bool HanListContains(const std::vector<std::string> &vec, const std::string &value)
{
    return std::find(vec.begin(), vec.end(), value) != vec.end();
}

// 函数：拆分字符串到一个字符串向量中
std::vector<std::string> SplitString(const std::string &str, char delimiter)

{
    std::vector<std::string> result;
    std::istringstream iss(str);
    std::string token;
    while (std::getline(iss, token, delimiter))
    {
        result.push_back(token);
    }
    return result;
}

std::vector<int16_t> ConvertAudioToInt16(std::vector<float> data)
{
    // 找到最大绝对值
    float maxVal = 0.0f;
    for (float val : data)
    {
        maxVal = std::max(maxVal, std::abs(val));
    }

    // 归一化数据，并乘以32767
    std::transform(data.begin(), data.end(), data.begin(), [maxVal](float val)
                   { return (val / maxVal) * 32767; });

    // 转换为 int16_t
    std::vector<int16_t> intData;
    intData.reserve(data.size());
    std::transform(data.begin(), data.end(), std::back_inserter(intData),
                   [](float val)
                   { return static_cast<int16_t>(std::lround(val)); });
    return intData;
}

std::string ToLowercase(const std::string &str)
{
    std::string lower_str = str;
    std::transform(lower_str.begin(), lower_str.end(), lower_str.begin(),
                   [](unsigned char c)
                   { return std::tolower(c); });
    return lower_str;
}
std::string ToUppercase(const std::string &str)
{
    std::string lower_str = str;
    std::transform(lower_str.begin(), lower_str.end(), lower_str.begin(),
                   [](unsigned char c)
                   { return std::toupper(c); });
    return lower_str;
}

std::vector<std::string> SplitEnSentenceToWords(const std::string &sentence)
{
    std::vector<std::string> tokens;
    std::string token;
    std::istringstream tokenStream(sentence);
    auto utf8_words = SplitUtf8String(sentence);

    // for (auto &w : utf8_words)
    // {
    //     if (w != " ")
    //     {
    //         tokens.push_back(w);
    //     }
    // }

    while (tokenStream >> token)
    {
        // 检查最后一个字符是否为标点符号
        // if (ispunct(token.back()))
        if (IsPunctuation(std::string(1, token.back())))
        {
            // 如果是，分离标点符号和前面的单词
            std::string word = token.substr(0, token.size() - 1);
            std::string punct(1, token.back());
            if (!word.empty())
            {
                tokens.push_back(word);
            }
            tokens.push_back(punct);
        }
        else
        {
            tokens.push_back(token);
        }
    }

    return tokens;
}

std::vector<std::vector<float>> DuplicateBlocks(const std::vector<std::vector<float>> &v, const std::vector<int> &word2ph, int bert_feat_dim)
{
    // blocksize = 312
    // assert(v.size() % bert_feat_dim == 0); // 确保 v 的大小是 bert_feat_dim 的整数倍
    int token_num = v.size(); // 计算原始块的数量
                              //    assert(word2ph.size() == token_num); // 确保 p 中元素数量与块数量一致

    assert(v.size() == word2ph.size());
    std::vector<std::vector<float>> result;
    for (int i = 0; i < word2ph.size(); ++i)
    {
        auto cur_bert_feat = v[i];
        for (int j = 0; j < word2ph[i]; ++j)
        { // 根据 p[i] 复制块 i
            result.push_back(cur_bert_feat);
        }
    }
    return result;
}

// You might need to adjust this function signature to fit your specific audio data structure
std::vector<int16_t> PadAudioForAtb(const std::vector<int16_t> &audio, int sample_rate)
{
    auto make_non_repeating_division_by_three = [](int n) -> int
    {
        if (n % 3 == 0)
        {
            // If the integer is already divisible by 3, return it
            return n;
        }
        else
        {
            // If the integer is not divisible by 3, increase it until it is
            while (n % 3 != 0)
            {
                ++n;
            }
            return n;
        }
    };

    // Start of the actual function logic
    std::vector<short> padded_audio = audio;
    double audio_length_in_second;
    int audio_length_in_frame;

    int fps = 30;
    int cur_frame_num = std::ceil(static_cast<double>(fps) * audio.size() / sample_rate);
    int interge_frame_num = make_non_repeating_division_by_three(cur_frame_num);
    int pad_audio_elements_num =
        static_cast<int>(interge_frame_num / static_cast<double>(fps) * sample_rate) - audio.size();

    // Add silence (zeros) at the end of the audio vector
    padded_audio.insert(padded_audio.end(), pad_audio_elements_num, 0);

    return padded_audio;
}

std::vector<int16_t> PadEmptyAudio(const std::vector<int16_t> &raw_audio_data, int sample_rate,
                                   double audio_pad_duration)
{
    // Calculate the number of samples for the padding duration
    size_t pad_samples_count = static_cast<size_t>(sample_rate * audio_pad_duration);

    // Create a vector of zeros for padding
    std::vector<int16_t> empty_audio(pad_samples_count, 0);

    std::vector<int16_t> audio_data;
    // Reserve space in the audio_data vector to avoid multiple reallocations
    audio_data.reserve(2 * pad_samples_count + raw_audio_data.size());

    // Concatenate the empty_audio, raw_audio_data, and empty_audio again
    audio_data.insert(audio_data.end(), empty_audio.begin(), empty_audio.end());
    audio_data.insert(audio_data.end(), raw_audio_data.begin(), raw_audio_data.end());
    audio_data.insert(audio_data.end(), empty_audio.begin(), empty_audio.end());
    return audio_data;
}

bool IsAllWhitespace(const std::string &str)
{
    return std::all_of(str.begin(), str.end(), [](char c)
                       { return std::isspace(c); });
}

std::vector<std::string> SplitChineseSentence(const std::string &input, const std::string &delimiter)
{
    std::vector<std::string> result;
    std::string::size_type start = 0;
    std::string::size_type end;

    while ((end = input.find(delimiter, start)) != std::string::npos)
    {
        std::string segment = input.substr(start, end - start);
        if (!segment.empty())
        {
            result.push_back(segment);
        }
        start = end + delimiter.length(); // Move past the delimiter
    }

    // Handle the last segment
    std::string lastSegment = input.substr(start);
    if (!lastSegment.empty())
    {
        result.push_back(lastSegment);
    }

    return result;
}

std::vector<std::string> SplitChineseSentenceToParts(const std::string &input, bool merge_punc)
{
    std::regex chinese_re("([^\u4e00-\u9fd5]+)|([\u4e00-\u9fd5]+)");

    std::sregex_token_iterator it(input.begin(), input.end(), chinese_re);
    std::sregex_token_iterator end;

    std::vector<std::string> result;

    for (; it != end; ++it)
    {
        if (!it->str().empty())
        {
            std::string delimiter = "。";
            auto r = SplitChineseSentence(it->str(), delimiter);
            for (auto &rr : r)
            {
                std::string delimiter2 = "、";
                auto rrr = SplitChineseSentence(rr, delimiter2);
                for (auto &rrrr : rrr)
                {
                    result.push_back(rrrr);
                }
            }
        }
    }

    if (merge_punc)
    {
        result = MergePunctuation(result);
    }
    return result;
}

std::vector<std::string> MergePunctuation(const std::vector<std::string> &input)
{
    std::vector<std::string> result;

    // 标点符号的正则表达式，可以根据需要修改
    std::regex punctuation_re(R"([,.!?，。！？])");

    for (const auto &word : input)
    {
        if (result.empty())
        {
            result.push_back(word);
        }
        else if (std::regex_match(word, punctuation_re))
        {
            // 如果当前字符串是标点符号，则将其合并到最后一个字符串的末尾
            result.back() += word;
        }
        else
        {
            // 如果当前字符串不是标点符号，则作为一个新的元素添加到结果中
            result.push_back(word);
        }
    }
    return result;
}

std::string Strip(const std::string &str, const std::string &chars)
{
    // 查找开头的位置
    size_t start = str.find_first_not_of(chars);
    // 查找结尾的位置
    size_t end = str.find_last_not_of(chars);

    // 如果整个字符串都是要去除的字符
    if (start == std::string::npos)
    {
        return ""; // 返回空字符串
    }

    // 返回去除前后指定字符后的字符串
    return str.substr(start, end - start + 1);
}

json LoadJson(const std::string &json_path)
{
    PLOG(INFO, "loading json file:" + json_path);
    json json_obj;
    std::ifstream file(json_path);

    if (file.is_open())
    {
        file >> json_obj;
        file.close();
    }
    else
    {
        PLOG(ERROR, "Failed to load json file: " + json_path);
    }
    return json_obj;
}

bool MatchHan(const std::string &input)
{
    // 正则表达式用于匹配汉字（Unicode范围 \u4E00到\u9FD5）
    std::regex pattern("([\u4E00-\u9FD5]+)");

    // 使用 std::regex_search 来测试是否有汉字
    return std::regex_search(input, pattern);
}

bool MatchHanInternal(const std::string &input)
{
    // 正则表达式用于匹配汉字（Unicode范围 \u4E00到\u9FD5）
    std::regex pattern(R"([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)");

    // 使用 std::regex_search 来测试是否有汉字
    return std::regex_search(input, pattern);
}

std::vector<std::string> SplitHanInternal(const std::string &input)
{
    // 正则表达式用于匹配汉字（Unicode范围 \u4E00到\u9FD5）
    std::regex pattern(R"([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)");

    // 使用 std::sregex_token_iterator 进行字符串分割
    std::sregex_token_iterator iter(input.begin(), input.end(), pattern, -1);
    std::sregex_token_iterator end;

    std::vector<std::string> result;
    for (; iter != end; ++iter)
    {
        result.push_back(iter->str());
    }

    return result;
}

bool MatchSkipInternal(const std::string &input)
{
    // 正则表达式用于匹配汉字（Unicode范围 \u4E00到\u9FD5）
    std::regex pattern(R"((\r\n|\s))");

    // 使用 std::regex_search 来测试是否有汉字
    return std::regex_search(input, pattern);
}

std::vector<std::string> SplitSkipInternal(const std::string &input)
{
    // 正则表达式匹配换行符或任意空白字符
    std::regex pattern(R"((\r\n|\s)+)"); // 使用 (+) 以匹配一个或多个空白字符或换行符

    // 使用 std::sregex_token_iterator 进行字符串分割
    std::sregex_token_iterator iter(input.begin(), input.end(), pattern, -1);
    std::sregex_token_iterator end;

    std::vector<std::string> result;
    for (; iter != end; ++iter)
    {
        result.push_back(iter->str());
    }

    return result;
}

bool IsNum(const std::string &input)
{
    // 正则表达式，用于匹配一个或多个数字和小数点
    std::regex pattern(R"([\.0-9]+)");

    // 使用 std::regex_match 检查输入字符串
    return std::regex_match(input, pattern);
}

bool IsEng(const std::string &input)
{
    // 定义正则表达式，用于匹配由字母和数字组成的一个或多个字符
    std::regex pattern(R"([a-zA-Z0-9]+)");

    return std::regex_match(input, pattern);
}

std::vector<std::vector<float>> SliceBertFeat(const std::vector<std::vector<float>> &bert_feat, int st, int ed)
{
    std::vector<std::vector<float>> res;
    for (int i = st; i < ed; i++)
    {
        res.push_back(bert_feat[i]);
    }
    return res;
}

std::vector<std::string> ReadTextFile(const std::string &file_path)
{
    std::ifstream file(file_path);
    std::vector<std::string> lines;

    // 检查文件是否成功打开
    if (!file.is_open())
    {
        PLOG(ERROR, "Error opening file: " + file_path);
        return lines; // 返回空的vector
    }

    std::string line;
    while (std::getline(file, line))
    {
        // 使用getline读取一行，并将其添加到vector中
        lines.push_back(line);
    }

    // 关闭文件
    file.close();

    return lines;
}

bool IsChineseEnding(const std::string &text)
{
    const std::vector<std::string> endings = {"。", "？", "！", "；"};
    return HanListContains(endings, text);
}

bool IsEnglishEnding(const std::string &text)
{
    const std::vector<std::string> endings = {".", "?", "!", ";"};
    return HanListContains(endings, text);
}

bool IsChinesePunctuation(const std::string &text)
{
    for (const auto &pair : punctuation_map)
    {
        if (pair.first == text)
        {
            return true;
        }
    }
    return false;
}

bool IsEnglishPunctuation(const std::string &text)
{
    for (const auto &pair : punctuation_map)
    {
        if (pair.second == text)
        {
            return true;
        }
    }
    return false;
}

bool IsPunctuation(const std::string &text)
{
    return IsChinesePunctuation(text) || IsEnglishPunctuation(text);
}

void Serialize(const std::unordered_map<std::string, std::vector<std::vector<std::string>>> &map, const std::string &filename)
{
    std::ofstream ofs(filename, std::ios::binary);
    if (!ofs)
    {
        std::cerr << "Cannot open file for writing: " << filename << std::endl;
        return;
    }

    // 写入条目数量
    size_t map_size = map.size();
    ofs.write(reinterpret_cast<const char *>(&map_size), sizeof(map_size));

    for (const auto &pair : map)
    {
        // 写入字符串键长度和内容
        size_t key_length = pair.first.size();
        ofs.write(reinterpret_cast<const char *>(&key_length), sizeof(key_length));
        ofs.write(pair.first.data(), key_length);

        // 写入外部 vector 的大小
        size_t outer_vector_size = pair.second.size();
        ofs.write(reinterpret_cast<const char *>(&outer_vector_size), sizeof(outer_vector_size));

        for (const auto &inner_vector : pair.second)
        {
            // 写入内部 vector 的大小
            size_t inner_vector_size = inner_vector.size();
            ofs.write(reinterpret_cast<const char *>(&inner_vector_size), sizeof(inner_vector_size));

            for (const auto &str : inner_vector)
            {
                // 写入字符串长度和内容
                size_t str_length = str.size();
                ofs.write(reinterpret_cast<const char *>(&str_length), sizeof(str_length));
                ofs.write(str.data(), str_length);
            }
        }
    }
}

// 反序列化函数
std::unordered_map<std::string, std::vector<std::vector<std::string>>> deserialize(const std::string &filename)
{
    std::unordered_map<std::string, std::vector<std::vector<std::string>>> map;

    std::ifstream ifs(filename, std::ios::binary);
    if (!ifs)
    {
        std::cerr << "Cannot open file for reading: " << filename << std::endl;
        return map;
    }

    // 读取条目数量
    size_t map_size;
    ifs.read(reinterpret_cast<char *>(&map_size), sizeof(map_size));

    for (size_t i = 0; i < map_size; ++i)
    {
        // 读取字符串键
        size_t key_length;
        ifs.read(reinterpret_cast<char *>(&key_length), sizeof(key_length));
        std::string key(key_length, '\0');
        ifs.read(&key[0], key_length);

        // 读取外部 vector 的大小
        size_t outer_vector_size;
        ifs.read(reinterpret_cast<char *>(&outer_vector_size), sizeof(outer_vector_size));
        std::vector<std::vector<std::string>> outer_vector(outer_vector_size);

        for (size_t j = 0; j < outer_vector_size; ++j)
        {
            // 读取内部 vector 的大小
            size_t inner_vector_size;
            ifs.read(reinterpret_cast<char *>(&inner_vector_size), sizeof(inner_vector_size));
            std::vector<std::string> inner_vector(inner_vector_size);

            for (size_t k = 0; k < inner_vector_size; ++k)
            {
                // 读取字符串
                size_t str_length;
                ifs.read(reinterpret_cast<char *>(&str_length), sizeof(str_length));
                std::string str(str_length, '\0');
                ifs.read(&str[0], str_length);
                inner_vector[k] = std::move(str);
            }
            outer_vector[j] = std::move(inner_vector);
        }
        map[key] = std::move(outer_vector);
    }

    return map;
}

void SaveJsonToBin(const std::string &filename, const json &j)
{
    std::ofstream ofs(filename, std::ios::binary);
    if (!ofs)
    {
        throw std::runtime_error("Unable to open file for writing");
    }

    // 将 JSON 对象序列化为文本，然后写入到二进制文件
    std::string json_str = j.dump(); // 转换为字符串
    size_t size = json_str.size();
    ofs.write(reinterpret_cast<const char *>(&size), sizeof(size)); // 写入长度
    ofs.write(json_str.c_str(), size);                              // 写入 JSON 字符串

    ofs.close();
}

// 从二进制文件读取并填充 std::map<std::string, std::string>
void LoadBinToMap(const std::string &filename, std::map<std::string, std::string> &m)
{
    std::ifstream ifs(filename, std::ios::binary);
    if (!ifs)
    {
        throw std::runtime_error("Unable to open file for reading");
    }

    // 读取 JSON 字符串的长度
    size_t size;
    ifs.read(reinterpret_cast<char *>(&size), sizeof(size)); // 读取长度

    // 读取 JSON 字符串
    std::string json_str(size, '\0');
    ifs.read(&json_str[0], size); // 读取 JSON 数据

    // 将 JSON 字符串解析为 map
    json j = json::parse(json_str);
    for (auto &[key, value] : j.items())
    {
        m[key] = value.get<std::string>(); // 填充 map
    }

    ifs.close();
}

std::string MergeLines(const std::string &multiLineString)
{
    std::string singleLineString = multiLineString; // 复制原始字符串

    // 移除换行符
    size_t pos;
    while ((pos = singleLineString.find('\n')) != std::string::npos)
    {
        singleLineString.replace(pos, 1, ""); // 把换行符替换为空格
    }

    return singleLineString;
}

// 计算文件内容的哈希值
std::string CalculateFileHash(const std::string &filePath)
{
    std::ifstream file(filePath, std::ios::binary);
    if (!file)
    {
        return "";
    }

    unsigned long long hash = 0;
    char buffer[4096]; // 4KB buffer
    while (file)
    {
        file.read(buffer, sizeof(buffer));
        std::streamsize count = file.gcount();
        for (std::streamsize i = 0; i < count; ++i)
        {
            hash = hash * 31 + static_cast<unsigned char>(buffer[i]);
        }
    }

    // 转换为16进制字符串
    std::stringstream ss;
    ss << std::hex << std::setfill('0') << std::setw(16) << hash;
    return ss.str();
}

std::string CreateSubDirectory(const std::string &parent_dir, const std::string &hash)
{
    try
    {
        fs::path dirPath = fs::path(parent_dir) / fs::path(hash);
        std::error_code ec;

        if (fs::create_directories(dirPath, ec) || fs::exists(dirPath, ec))
        {
            return dirPath.string();
        }

        return "";
    }
    catch (const std::exception &)
    {
        return "";
    }
}

// 创建或获取文件对应的哈希目录
std::string GetOrCreateHashDirectory(const std::string &parent_dir, const std::string &filePath)
{
    try
    {
        if (!fs::exists(filePath))
        {
            return "";
        }

        // 计算文件哈希
        std::string hash = CalculateFileHash(filePath);
        if (hash.empty())
        {
            return "";
        }

        // 创建对应的目录
        return CreateSubDirectory(parent_dir, hash);
    }
    catch (const std::exception &)
    {
        return "";
    }
}
